JSONB з індексуванням до hstore


28

Я намагаюся визначитися з дизайном бази даних, маючи на цьому етапі якомога менше припущень (щодо того, як насправді розвивається веб-додаток).

В якості першого кроку, розуміючи, що JOINS - це дорого, я розглядаю невелику кількість монолітних таблиць на відміну від великої кількості нормалізованих менших таблиць. Як другий момент, я плутаюся між використанням hstore vs звичайних таблиць проти JSONB (з індексацією GiST).

AFAIK (будь ласка, не соромтеся виправляти):

  1. Як правило, у Postgres, як відомо, hstore працює краще, ніж інші типи даних. Ця презентація від FOSDEM PGDAY має цікаву статистику (у другій половині слайдів). https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf

  2. Перевагою hstore є швидке індексування (GiN або GiST). Однак за допомогою JSONB, GiN та GiST індексація також може бути застосована до даних JSON.

  3. У цьому щоденнику професіонала на другому квадранті сказано: «Напевно, варто замінити використання hstore на jsonb у всіх нових програмах» (прокручуйте до кінця): http://blog.2ndquadrant.com/postgresql-anti-patterns-unne необходимо -jsonhstore-динамичні стовпці /

Тому я хотів би визначитися з наступним:

  1. Для основної (структурованої) частини даних: вона повинна містити пару реляційних таблиць (порівняно велика з багатьма стовпцями), чи це має бути ряд ключових сховищ, що використовують hstore?
  2. Якщо дані про спеціальні (внесені / неструктуровані користувачем) дані повинні бути в JSON або сховищах ключових значень в hstore (з ключами, що зберігаються в одній з основних реляційних таблиць)?

7
Приєднання недешеве. Хто вам це сказав? Оскільки в основному вся концепція реляційних баз даних обертається навколо з'єднань (з практичної точки зору), цей продукт дуже добре поєднується. Нормальний спосіб мислення починається з належним чином нормалізованих структур і переходить у химерні денормалізації та подібні речі, коли вистава дійсно потребує цього з боку читання. JSON(B)і hstore(і EAV) корисні для даних з невідомою структурою.
dezso

6
@Yogesch ці посилання містять цікаві та дико суперечливі речі :) Як морально, схоже, що MySQL (був) поганий приєднанням, і люди NoSQL прагнуть узагальнити це поняття без фактичної фактичної основи. З іншого боку, Аарон та Макс чутливі до цього p-слова - його широке використання показує, як нерічні мовники (включаючи мене) із задоволенням використовують неправильне слово.
dezso

4
@Yogesch реально я впевнений, що в Інтернеті є джерело, яке може "довести" що-небудь, як і будь-який релігійний текст можна використовувати для виправдання жорстокостей (як це драматично показано в історії). Це правда, чим менше роботи ти робиш, тим менше це коштує, але завжди є якась торгівля .
Ерік

4
@Yogesch: Уникнення приєднання важливо для важких операцій, де ви знаєте шаблон доступу до даних заздалегідь, і тому ви можете безпечно розміщувати всі необхідні дані в один ряд. Однак це робить інші приєднання потенційно більш дорогими. Хто скаже, що вам не потрібно буде приєднуватися до даних різними способами, щоб відповідати на різні запитання? Тепер ми просто перейдемо до теорії реляційного моделювання даних ...
Кріс,

5
@Yogesch У моїй практиці, з базами даних вузьким місцем рідко є оперативна пам'ять або процесор, але це введення / виведення - такий спосіб уникнення зберігання зайвих даних все ще є важливою справою. Як каже Кріс, якщо ви завжди бачите свої дані лише одним способом, це може бути ціною. Якщо ні, то ви там з об'ємним і дуже негнучким фрагментом даних.
dezso

Відповіді:


41

Реляційні бази даних розроблені навколо об'єднань та оптимізовані для того, щоб зробити їх добре.

Якщо у вас немає вагомих причин не використовувати нормалізовану конструкцію, використовуйте нормалізовану конструкцію.

jsonbі такі речі hstoreкорисні, коли ви не можете використовувати нормалізовану модель даних, наприклад, коли модель даних швидко змінюється і визначається користувачем.

Якщо ви можете моделювати її реляційно, моделюйте її відносно. Якщо ви не можете, врахуйте json тощо. Якщо ви обираєте між json / jsonb / hstore, зазвичай вибирайте jsonb, якщо у вас немає причин цього не робити.

Це я сказала у своєму дописі в блозі , який стосується саме цієї теми. Будь ласка, прочитайте весь пост . Пункт, який ви цитували, вказує, що якщо ви обираєте динамічну структуру, вам слід вибрати jsonb над hstore, але решта публікації в блозі стосується того, чому ви зазвичай віддаєте перевагу моделюванню у реляційному режимі, якщо можете.

Так. Моделюйте основну структуровану частину реляційно. Якщо таблиці дійсно широкі з великою кількістю стовпців, це може бути ознакою необхідності подальшої нормалізації. Не бійтеся приєднань. Навчіться любити приєднання. Приєднання до багатьох невеликих таблиць часто буде швидшим, ніж запит та підтримка великих денормалізованих таблиць. Денормалізуйте лише в тому випадку, якщо вам потрібно для конкретних випадків, а краще за допомогою матеріалізованих поглядів ..., але не робіть цього, доки не знаєте, що вам потрібно і не вирішите конкретну проблему.

Для даних, внесених користувачем, вільної форми та неструктурованих, використовуйте jsonb. Він повинен виконуватись так само добре, як і hstore, але це гнучкіше і легше працювати.

Важливо зрозуміти: індекси GiST та GIN, як ті, що використовуються на jsonb, як правило, набагато менш ефективні, ніж звичайний індекс b-дерева. Вони більш гнучкі, але індекс b-дерева у звичайному стовпчику майже завжди буде набагато, набагато швидшим.


Велике спасибі Крейгу, зараз я набагато краще розумію і знаю, що робити. Подальше запитання: якщо я зберігаю щось на кшталт лайків чи підписників у форматі двох стовпців (post_id та user_id, для лайків ), чи краще використовувати реляційну таблицю з двома стовпцями чи hstore? (Я не проти перетворювати це на нове запитання)
Йогеш

5
@Yogesch Це звучить як стандартна таблиця приєднання m: n з послідовним та стабільним форматом. Завжди має бути питання: "Чи є вагома причина, що я не повинен робити це звичним для цього випадку реляційним способом?".
Крейг Рінгер

hstoreзастаріло. Використовуйте jsonb.
небезпека89

2
@ небезпека89 Насправді це формально не є застарілим, хоча я не думаю, що є більше причин використовувати його на користь jsonb. У будь-якому випадку ... це щось не вистачає сенсу. Питання полягає в тому, чи можна моделювати реляційно чи використовувати структурований тип даних.
Крейг Рінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.