Подтвердить что ты не робот

Появляется Postgresql JSONB. Что теперь использовать? Hstore? JSON? EAV?

Пройдя реляционную дискуссию по исследованиям в области DB/NoSQL, я пришел к выводу, что буду двигаться вперед с PG в качестве хранилища данных. Большая часть этого решения была объявлением JSONB на 9,4. Мой вопрос - что мне теперь делать, создавая приложение с нуля, зная, что я хочу перейти на (я имею в виду использование прямо сейчас!) Jsonb? Параметры DaaS для меня будут работать 9.3 на некоторое время.

Из того, что я могу сказать, и исправьте меня, если я ошибаюсь, hstore будет работать довольно быстро, так как я буду делать много запросов из многих ключей в столбце hstore, и если бы я использовал простой json Я бы не смог воспользоваться индексированием /GIN и т.д. Однако я мог бы воспользоваться вложением с json, но выполнение любых запросов будет очень медленным, и пользователи будут разочарованы.

Итак, я создаю свое приложение вокруг текущей версии типа hstore или json, "хорошего ol" EAV или чего-то еще? Должен ли я структурировать код БД и приложения определенным образом? Любые советы будут очень признательны. Я уверен, что другие могут столкнуться с тем же вопросом, что и мы, ожидая следующего официального выпуска PostgreSQL.

Несколько дополнительных сведений о приложении, которое я хочу построить:

-Очень реляционная (с одним исключением ниже)
-Стальный социальный аспект сети (группы, друзья, симпатии, временные рамки и т.д.)
-Основанный вокруг одного объекта с переменными назначенными пользователем атрибутами, может быть, 10 или 1000+ (здесь возникает необходимость в дизайне без схемы)

Заранее благодарим за любой ввод!

4b9b3361

Ответ 1

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

CREATE INDEX idx_foo_somekey ON foo((bar ->> 'somekey'));

Теперь, когда у вас есть WHERE bar ->> somekey, он должен использовать индекс.

И, конечно же, будет проще использовать вложенные данные и перейти на jsonb, когда он станет доступен вам.

Таким образом, я бы склонился к JSON, если вы точно не знаете, что собираетесь атаковать серверную задницу с использованием ключевых извлечений, прежде чем у вас появится шанс обновиться до 9.4. Но чтобы быть уверенным в этом, я бы сказал, сделайте некоторый бенчмаркинг с ожидаемыми объемами запросов сейчас и посмотрите, что лучше всего подходит вам.

Ответ 2

Вероятно, вы не можете дать достаточно подробный ответ, но я скажу это... Если ваши данные "очень реляционные", то я считаю, что ваш лучший курс - построить его с хорошим реляционным дизайном. Если это только одно поле с "переменными назначенными атрибутами", то это похоже на хорошее использование для hstore. На данный момент это довольно верно и верно. Я читал 9.4, а jsonb звучит круто, но это не будет долгое время. Я подозреваю, что хороший дизайн схемы в 9.3 + очень целевое использование hstore, вероятно, даст хорошее сочетание производительности и гибкости.