2015-03-08 7 views
5

Предположим, что вы хотите сохранить «теги» на своем объекте (скажем, сообщение). С выпуском 9.4 у вас есть 3 основных варианты:Разве JSONB делает массивы PostgreSQL бесполезными?

  • теги как текст []
  • тегов как jsonb
  • тегов как текст (и запоминание JSON строка в виде текста)

Во многом случаев, 3-го было бы непостижимым, поскольку это не позволяло бы условию запроса соответствовать значению тегов. В моем текущем развитии мне не нужны такие запросы, теги только там отображаются в списке сообщений, а не для фильтрации сообщений.

Итак, выбор в основном между text[] и jsonb. Оба могут быть запрошены.
Что вы бы использовали? И почему?

+3

http://www.databasesoup.com/2015/01/tag-all-things-part-2.html –

+0

хорошая ссылка. У меня есть мой ответ: я удивлен, насколько быстро JSONB, но все же ARRAY работает обычно лучше. спасибо. – comte

+0

Действительно хорошая ссылка! Запросы для примеров JSONB и List (часть 3 в статье) выглядят намного проще, чем в нормализованных табличных версиях. – Rotareti

ответ

4

В большинстве случаев я хотел бы использовать normalized schema с таблицей option_tag реализующей многие-ко-многим между таблицами option и tag. Ссылка реализация здесь:

Это может быть не самый быстрый вариант во всех отношениях, но он предлагает полный спектр функциональных возможностей БД, в том числе ссылочной целостности, ограничений, полный спектр типов данных , все параметры индекса и дешевые обновления.

Для полноты добавить в список опций:

  • hstore (хороший вариант)
  • xml более многословным и более сложным, чем любой hstore или jsonb, поэтому я хотел бы использовать его только при работе с XML ,
  • «строка значений, разделенных запятыми» (очень простой, в основном плохой вариант)
  • EAV (Entity-Attribute-Value) или «пары имя-значение» (в основном плохой вариант)
    детали под этим смежный вопрос о dba.SE:

Если список только для отображения и редко обновляется, я хотел бы рассмотреть простой массив, который, как правило, меньше, и работает лучше для этого чем остальные.

Прочитать blog entry by Josh Berkus с помощью ссылки @a_horse в своем комментарии. Но имейте в виду, что он фокусируется на выбранных случаях чтения. Джош уступает:

Я понимаю, что я не тестировал сравнительные скорости записи.

И вот здесь нормализованный подход выигрывает большой, особенно когда вы меняете отдельные теги под параллельной нагрузкой.

jsonb - это только хороший вариант, если вы собираетесь работать с JSON в любом случае и можете хранить и извлекать JSON «как есть».

+0

Нормализованная схема - это не мои чашки чая: она добавляет две таблицы, требует объединения для выполнения запросов, но, прежде всего, данных фрагментов. Я думаю, именно поэтому были реализованы массивы: один объект, одна таблица. также моя точка зрения заключается в том, что большинство преимуществ «нормализованной схемы» должны быть реализованы в приложении, иначе у вас есть проблема с приложением. почему вы говорите: «jsonb - это только хороший вариант, если вы собираетесь работать с JSON в любом случае»? это так, но у jsonb есть одно большое преимущество: гибкость. – comte

+1

Если какой-либо выбор пользовательских типов данных, таких как JSONB, не обеспечивает гибкости. Вы будете ограничены тем, какие библиотеки баз данных/ORM вы можете использовать, поскольку большинство из них не поддерживает сбор, например, типы данных. –

+1

Вот почему прибыль ORMs (на мой взгляд) сомнительна. Не уверен, что вы получаете в простоте, что вы теряете в гибкости. Они отстают от прогресса БД, у них есть (небольшая) стоимость, чтобы войти. Но это личное мнение. – comte

1

Я использовал как нормализованную схему, так и просто поле text с CSV-разделителями вместо пользовательских типов данных (вместо CSV вы можете использовать JSON или любую другую кодировку, такую ​​как www-urlencoding или даже кодирование атрибутов XML). Это связано с тем, что многие библиотеки ORM и базы данных не очень хорошо поддерживают настраиваемые типы данных (hstore, jsonb, array и т. Д.).

@ ErwinBrandstetter пропустил еще пару преимуществ нормализованного, поскольку гораздо быстрее запрашивать все возможные ранее используемые теги в нормализованной схеме, чем параметр массива. Это очень распространенный сценарий во многих системах тегов.

Это означает, что я рекомендую использовать Solr (или elasticsearch) для запроса тегов, поскольку он имеет дело с количеством тегов и общим префиксом тегов, намного лучше, чем то, что я мог бы получить Postgres, если вы готовы иметь дело с аспектами согласованности синхронизации с поисковой системой. Таким образом, хранение тегов становится менее важным.

+0

Я, конечно, пропустил большинство плюсов и минусов, так как это огромная тема, и я просто назвал пару важных функций. Вы добавили еще немного, поддержка ORM, вероятно, важна для многих ... –

Смежные вопросы