【问题标题】:Using PostgreSQL hstore for i18n为 i18n 使用 PostgreSQL hstore
【发布时间】:2015-11-03 18:20:36
【问题描述】:

我只是为需要本地化支持的新项目建模 PostgreSQL 数据库。我想知道 hstore 是否是本地化某些数据字段的好方法。

例如:让我们为博客文章创建一个简化表,其中包含字段post_titlepost_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 | ...                   | ...

有人有这种方法的经验吗?它似乎非常灵活且易于使用,但也许我在这里遗漏了一些重大缺点?

【问题讨论】:

  • 有趣的想法我认为对此进行查询会很痛苦,但我不确定其他 i18n 模型有什么更好的。也不确定查询计划器将如何优化跨 hstore 值的连接等内容。
  • 这种方法可以做全文搜索吗?
  • @OlegYablokov,您可以在WHERE 子句中使用 hstore 值,并且您可以选择特定字段(例如用于构建文档索引),所以我想这应该是可行的。我最近阅读了an interesting article on full-text search in Postgres——与 hstore 无关,但它的想法也可以与 hstore 一起使用。

标签: postgresql internationalization hstore


【解决方案1】:

我也在一个项目中使用这种方法,我相信这是一个不错的决定,因为我可以轻松地在我的项目中添加一种新语言,而无需编写代码或更新数据库架构

我还可以轻松地为这样的查询添加回退:

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

另外还有很多 powerful sql functions 供您使用。

【讨论】:

  • 我也在使用这种方法,从几乎每个角度来看,它都非常有效。我发现的唯一复杂情况是当我需要仅基于语言的列是唯一的。 IE。条目('en' => 'foo', 'es' => 'foo') 是可能的,但另一个带有('en' => 'foo', 'es' => 'bar') 的条目不应该是可能的,因为'en' => 'foo' 已经存在。关于创建以这种方式工作的唯一约束的简单方法的任何建议?我目前正在使用UNIQUE INDEX,但这不是一个非常易于维护的解决方案,因为我需要为每个语言创建一个索引
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多