Size: a a a

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

2020 May 25

AB

Alex Bubnov 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) Да, при поиске будет теряться связь между вложенными таблицами, но это такая цена подхода, и если это неприемлемо, то нужно использовать обычные таблички

Кто что думает?
Я поглядел на проект, который начинался с широких таблиц на протяжении полутора лет. Очень-очень быстро возникли проблемы с дедупликацией данных, да и с разделением их на куски при детализации предметки
источник

OR

Oleg Roshchupkin in Clojure — русскоговорящее сообщество
Alex Bubnov
Я поглядел на проект, который начинался с широких таблиц на протяжении полутора лет. Очень-очень быстро возникли проблемы с дедупликацией данных, да и с разделением их на куски при детализации предметки
А вообще да — начать с нормальных данных и денормализовать по необходимости
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
Alex Bubnov
Я поглядел на проект, который начинался с широких таблиц на протяжении полутора лет. Очень-очень быстро возникли проблемы с дедупликацией данных, да и с разделением их на куски при детализации предметки
тут еще такой момент. у меня агрегат целиком пишется и читается.
если полей много, значит, не так разбили на агрегаты и контексты
источник

MK

Mikhail Kuzmin in Clojure — русскоговорящее сообщество
как бы вариант с json или массивом - это такой "костыль"
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
И я не бы не считал джойны дорогими по умолчанию, это какая-то очень преждевременная оптимизация.
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
Я, честно говоря, не большой любитель дизайна от агрегатов и контекстов, я предпочитаю сначала заиметь приличную бд, а потом уже разбираться с кодом приложении.
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
У бд срок жизни обычно дольше, чем у кода.
У нас одна структура бд с незначительными изменениями живёт уже лет шесть в двух разных конторах, а использует её уже третье, кажется, поколение сервисов.
И только сейчас мы её собираемся редизайнить, потому что совсем из неё выросли
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
если данные в EAVTop, то почему не создать такую же таблицу в PG
источник

IG

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

AL

Arseniy Lebedev in Clojure — русскоговорящее сообщество
Mike Ananev
(печатьнс "Привет, мир!")
кек
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
можно хранить в нем кложурное представление объекта и читать через read-string. Хотя опять непонятно, зачем все это. На сервере пусть обычный датомик, а клиенту передавать нужные датомы и читать их в Datascript
источник

AB

Alex Bubnov in Clojure — русскоговорящее сообщество
Ivan Grishaev
можно хранить в нем кложурное представление объекта и читать через read-string. Хотя опять непонятно, зачем все это. На сервере пусть обычный датомик, а клиенту передавать нужные датомы и читать их в Datascript
не всегда и не всем можно продать датомик.
источник

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
ну и вообще, jsonb вполне норм будет. Перед записью данные проверять спекой. После их чтения даты можно восстановить через conformer-спеку
источник

IG

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

MA

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

MA

Mike Ananev in Clojure — русскоговорящее сообщество
И какой объем данных в ней, если не секрет?
источник

IG

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

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Ну, объем точно не скажу, это считать надо
источник

IG

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

IG

Ivan Grishaev in Clojure — русскоговорящее сообщество
Вот я недавно словил такое поведение, что если в базе > 50К удаленных записей, запрос не выполнится пока их не снесешь.
источник