Я пытаюсь определиться с дизайном базы данных, используя как можно меньше предположений (относительно того, как на самом деле развивается веб-приложение) на данном этапе.
В качестве первого шага, понимая, что СОЕДИНЕНИЯ являются дорогостоящими, я рассматриваю небольшое количество монолитных таблиц, а не большое количество нормализованных меньших таблиц. Во-вторых, я запутался между использованием hstore против обычных таблиц и JSONB (с индексацией GiST).
AFAIK (пожалуйста, не стесняйтесь исправлять):
Как правило, в Postgres hstore работает лучше, чем другие типы данных. Эта презентация от FOSDEM PGDAY содержит некоторые интересные статистические данные (во второй половине слайдов). https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf
Преимущество hstore - быстрая индексация (GiN или GiST). Однако с помощью JSONB индексация GiN и GiST также может применяться к данным JSON.
Этот блог от профессионала из 2nd Quadrant гласит: «На данный момент, вероятно, стоит заменить использование hstore на jsonb во всех новых приложениях» (прокрутите до конца): http://blog.2ndquadrant.com/postgresql-anti-patterns-unneeded -jsonhstore-динамические-столбцы /
Поэтому я хотел бы принять решение о следующем:
- Для основной (структурированной) части данных: должны ли они находиться в паре реляционных таблиц (относительно больших с большим количеством столбцов) или это должно быть несколько хранилищ значений ключей, использующих hstore?
- Для специальных данных (пользовательские / неструктурированные) данные должны быть в JSON или специальные значения ключей хранятся в hstore (с ключами, хранящимися в одной из основных реляционных таблиц)?
источник
JSON(B)
иhstore
(и EAV) хороши для данных с неизвестной структурой.Ответы:
Реляционные базы данных созданы на основе объединений и оптимизированы для их успешного выполнения.
Если у вас нет веской причины не использовать нормализованный дизайн, используйте нормализованный дизайн.
jsonb
и такие вещиhstore
хороши, когда вы не можете использовать нормализованную модель данных, например, когда модель данных быстро меняется и определяется пользователем.Если вы можете смоделировать его реляционно, смоделируйте его реляционно. Если вы не можете, рассмотрите json и т. Д. Если вы выбираете между json / jsonb / hstore, обычно выбирайте jsonb, если у вас нет причин не делать этого.
Об этом я и говорил в своем блоге , посвященном именно этой теме. Пожалуйста, прочитайте весь пост . В абзаце, который вы цитировали, указывается, что если вы выбираете динамическую структуру, вам следует выбрать jsonb вместо hstore, но остальная часть поста блога посвящена тому, почему вы, как правило, предпочитаете реляционную модель, если можете.
Так. Смоделируйте основную структурированную часть реляционно. Если таблицы действительно широкие с большим количеством столбцов, это может указывать на необходимость дальнейшей нормализации. Не бойся объединений. Учись любить, присоединяется. Присоединение ко многим маленьким таблицам часто будет быстрее, чем запрашивать и поддерживать большие денормализованные таблицы. Денормализуйте только в том случае, если вам это необходимо для конкретных случаев, и желательно с помощью материализованных представлений ... но не делайте этого, пока не узнаете, что вам нужно, и не решите конкретную конкретную проблему.
Для пользовательских данных, которые имеют произвольную и неструктурированную форму, используйте jsonb. Он должен работать так же хорошо, как и hstore, но он более гибкий и с ним легче работать.
Нужно понимать одну важную вещь: индексы GiST и GIN, подобные тем, которые используются в jsonb, обычно гораздо менее эффективны, чем простые индексы b-дерева. Они более гибкие, но индекс b-дерева в нормальном столбце почти всегда будет намного, намного быстрее.
источник
hstore
не рекомендуется. Использованиеjsonb
.