Использование PostgreSQL hstore для i18n

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

Например: возьмем упрощенную таблицу для сообщений в блоге с полями post_title и post_content. С помощью типа "ключ-значение" hstore можно добавить несколько переводов в эти поля, обозначенные кодом языка в качестве ключа:

id | post_title (hstore)   | post_content (hstore)
---|-----------------------|------------------------------
 1 | "en" => "Hello World",| "en" => "Content in english",
   | "de" => "Hallo Welt"  | "de" => "Inhalt auf deutsch"
---|-----------------------|------------------------------
 2 | ...                   | ...

Есть ли у кого-нибудь опыт такого подхода? Он кажется очень гибким и простым в использовании, но, может быть, мне здесь не хватает существенных недостатков?


person Matthias Lohscheidt    schedule 03.11.2015    source источник
comment
Интересная идея. Я думаю, что запросить это было бы головной болью, но я не уверен, что это лучше с другими моделями i18n. Также не уверен, как планировщик запросов будет оптимизировать такие вещи, как объединение значений hstore.   -  person Evan Carroll    schedule 12.05.2016
comment
Можно ли при таком подходе выполнять полнотекстовый поиск?   -  person Oleg Yablokov    schedule 29.04.2021
comment
@OlegYablokov, вы можете использовать значения hstore в предложениях WHERE, и вы можете выбирать определенные поля (например, для создания индексов документов), поэтому я думаю, что это должно быть осуществимо. Недавно я прочитал интересную статью о полнотекстовом поиске в Postgres - не относится к hstore, но его идеи можно использовать и с hstore.   -  person Matthias Lohscheidt    schedule 03.05.2021


Ответы (1)


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

Также я могу легко добавить откат к таким запросам:

select coalesce(nullif(post_title -> :lang, ''), post_title -> 'en') from posts

Кроме того, существует множество мощных функций sql В вашем распоряжении.

person yglodt    schedule 18.05.2018