在NoSQL解决方案中支持多种语言?

时间:2012-12-13 09:57:41

标签: database-design localization nosql

我们即将开始一个新项目,我们将(希望)支持1000个客户,因此我们正在研究这个架构。该应用程序的一个关键方面是支持多种语言(英语,西班牙语等,语言数量没有限制)。我们在建模方面有很多经验,这是传统的RDBMS(Sql Server,Oracle等),但是在NoSQL'建模'方面我们正在努力。在SQL模型中,我们将创建一个“文本”表,其中“语言”列指向具有所有不同语言的“语言”表。这样,所有文本都可以用所有支持的语言表示。考虑一个简单的例子:

表:类别 columns:id(PK),Enabled(Bool)

表:Category_Descriptions columns:id(PK),CategoryID(FK),LanguageID(FK),Description(Text)

表:语言 columns:id(PK),Enabled(Bool)

表:Language_Descriptions 列:id(PK),DescriptionLanguageID(FK),LanguageID(FK),描述(文本)

因此所有语言都将存储在Language表中,其相应的描述存储在Language_Descriptions表中。此外,所有类别都将存储在Category表中,并在Category_Descriptions表中包含所有语言的描述。因此,要获得给定语言的所有类别(英语= 1):

select c.id, cd.Description 
from   Category c, Category_Descriptions cd 
where  c.id = cd.CategoryID 
and    c.Enabled = 1;

当然,一个类别本身并不是很有用;它将成为另一个实体的一部分,例如事故报告:

表:事件 columns:id(PK),Created(Date),CategoryID(FK)等。

要从此表中获取信息,我将像以前一样进行相同的连接,并选择正确语言的描述列。基本的东西,我们之前都已经完成了这个......

最后,我们得出了一个问题:如何将这个存储在NoSQL数据库中? :)

我看过几个(不好的)解决方案:

  1. 仅存储代码,然后查找正确的描述运行时
  2. 存储上次使用的说明以及语言代码和 然后更新语言是否已更改(不同的用户)
  3. 将所有说明存储在同一文档中
  4. 以活动语言存储代码说明,然后在需要时将说明添加到新语言中(即以未使用的语言请求时)
  5. 所有这些解决方案都有很多缺点,需要大量的工作来实现和维护......所以,任何关于如何最好地解决这个问题的意见将不胜感激。

    编辑:我们正在研究NoSQL有两个原因:

    1. 表现(比例)
    2. 动态架构(需要做很多工作才能在SQL中实现)

2 个答案:

答案 0 :(得分:3)

已经有一段时间了,但是我想到为什么不=)......

根据我对NoSQL的经验,你必须首先真正尝试忘记你的RDMS背景和你对数据标准化的强烈愿望。有冗余数据是可以的。可以大量存储东西(即使它是多余的!)数据不一致是可以的。换句话说,既然您可以将语言描述存储在可能的5个地方......那么这5个地方可以在一段时间内保持不同。

如果您愿意以性能和动态架构的名义做出这些让步,那么这可能有助于您建模。

我认为一个好的起点是使用UI作为模型。如果您是一名Web开发人员并且想要这些数据,那么您需要什么?理想情况下,您希望最大限度地减少Web开发人员为获得所需内容而需要进行的调用次数。这有时可以帮助您决定将多少信息放入文档中。

我认为您暗示了使用SQL示例跨文档运行查询的能力。换句话说,如果你尽力而为,创建10种文档类型,并且事情进展顺利,然后你突然意识到你需要做一个“加入”,你就会遇到麻烦。

NoSQL不善于进行概念连接。

他们大多数人的方式是使用map / reduce。例如,在Mongo中,您可以编写map / reduce函数,它们实际上将为您提供连接功能。然而,你支付速度的价格。

但是如果你愿意让复杂的查询(不符合原始文档模型的东西)运行得慢一些,你可以完成你想要的任何事情。

您如何确定哪些查询需要快速以及哪些查询可能有点慢?再一次,我会指向UI。

建模的简单试验和错误确实帮助了我。我意识到这是一个蹩脚的建议,但这是真的。 =)

答案 1 :(得分:2)

您可以将描述字段设置为具有两个字段的对象数组:区域设置和文本。只需确保此数组的第一个成员始终是默认语言环境中的值。