Size: a a a

Clojure — русскоговорящее сообщество

2020 May 25

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
А надо было удалить несколько миллинов записей
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
Знаю, что не по адресу. Но наверняка тут многие пользуются postgres.

Есть проблема. Хочется хранить вложенные данные рядом. Т.е. не нормализованно по табличкам, а рядом. И искать с индексами.
Есть jsonb, с индексами и json path. НО.
1) jsonb для динамических данных. Тут речь же о данных, имеющих схему и типы.
2) jsonb хранит ключи каждый раз. В итоге по большей части хранятся имена ключей, а не данные.
3) jsonb пока не умеет даты/время. Он точно не будет поддерживать постгресовые типы и индексы. Например диапазоны, гео точки.
 
Есть подход, применяемый в elastci search, когда данные делают плоскими и хранят каждую колонку как массив.
Еще так делает, например click house.
https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html#nested-arrays-flattening-objects
https://clickhouse.tech/docs/ru/sql-reference/data-types/nested-data-structures/nested/

т.е post.translation.title string[], post.translation.content text[]. Т.е. данные транспонируют или уплощают.
Тут есть особенности, если так делать с документом, то будут теряться связи, но если использовать реляции, то все ок.
Таким образом можно встраивать вложенные таблицы.
1) Будут доступны миграции, можно добавить/удалить/изменить колонку
2) Можно строить gin/gist индексы, можно делать фкнциональные индексы
3) Есть схема с привычными типами. Названия полей не пишутся каждый раз.
4) Да, при поиске будет теряться связь между вложенными таблицами, но это такая цена подхода, и если это неприемлемо, то нужно использовать обычные таблички

Кто что думает?
В постгресе можно сделать свои композитные типы, пишут что это уже происходит при создании таблицы.
https://www.postgresql.org/docs/9.5/sql-createtype.html
...но как бы поддержка этих типов в БД актуальными не принесла даже больше боли, чем JSONB.
источник

MA

Mike Ananev in Clojure — русскоговорящее сообщество
Ivan Grishaev
натуральная кассандра, да. Есть и mysql, но джейсоны в кассандре лежат.
А вы с кассандрой на кложе работаете?
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
через alia и alia-component
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
в итоге захайрили разраба этой либы
источник

MA

Mike Ananev in Clojure — русскоговорящее сообщество
Да, я знаю эту либу. Сам с ней работал с кассандрой.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Pavel Peganov
В постгресе можно сделать свои композитные типы, пишут что это уже происходит при создании таблицы.
https://www.postgresql.org/docs/9.5/sql-createtype.html
...но как бы поддержка этих типов в БД актуальными не принесла даже больше боли, чем JSONB.
да, так можно сделать
но. не понятно как менять схему, может быть и можно
но главное, не понятно как по такому искать, т.к. индекс тут уже не построишь
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
да почему, искать вполне можно по json-у
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
видимо, проще сделать и показать =)
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Mikhail Kuzmin
да, так можно сделать
но. не понятно как менять схему, может быть и можно
но главное, не понятно как по такому искать, т.к. индекс тут уже не построишь
Почему индекс не построить? Какой, например?
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Ivan Grishaev
да почему, искать вполне можно по json-у
да, только еще раз
1) jsonb для динамических данных. Тут речь же о данных, имеющих схему и типы.
2) jsonb хранит ключи каждый раз. В итоге по большей части хранятся имена ключей, а не данные.
3) jsonb пока не умеет даты/время. Он точно не будет поддерживать постгресовые типы и индексы. Например диапазоны, гео точки.
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Pavel Peganov
Почему индекс не построить? Какой, например?
по полю вложенной таблицы
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
только если функциональный
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
1) схему ты проверяшь спекой до записи в базу. Потребителям даешь высокоруровневые апихи
источник

PP

Pavel Peganov in Clojure — русскоговорящее сообщество
Ну вот да, на функциональный можно натянуть почти что угодно.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
3) функциональные индексы через вывод типов
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
2) да, есть zson, но что-то его не очень поддерживают
https://github.com/postgrespro/zson
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
блин, нет примера под рукой. Но ты можешь написать выражение, которое приводит колонку к нужному типу и по нему сделать индекс
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
2) фиг с ними с ключами, это не важно
источник