我们即将开始一个新项目,我们将(希望)支持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数据库中? :)
我看过几个(不好的)解决方案:
所有这些解决方案都有很多缺点,需要大量的工作来实现和维护......所以,任何关于如何最好地解决这个问题的意见将不胜感激。
编辑:我们正在研究NoSQL有两个原因:答案 0 :(得分:3)
已经有一段时间了,但是我想到为什么不=)......
根据我对NoSQL的经验,你必须首先真正尝试忘记你的RDMS背景和你对数据标准化的强烈愿望。有冗余数据是可以的。可以大量存储东西(即使它是多余的!)数据不一致是可以的。换句话说,既然您可以将语言描述存储在可能的5个地方......那么这5个地方可以在一段时间内保持不同。
如果您愿意以性能和动态架构的名义做出这些让步,那么这可能有助于您建模。
我认为一个好的起点是使用UI作为模型。如果您是一名Web开发人员并且想要这些数据,那么您需要什么?理想情况下,您希望最大限度地减少Web开发人员为获得所需内容而需要进行的调用次数。这有时可以帮助您决定将多少信息放入文档中。
我认为您暗示了使用SQL示例跨文档运行查询的能力。换句话说,如果你尽力而为,创建10种文档类型,并且事情进展顺利,然后你突然意识到你需要做一个“加入”,你就会遇到麻烦。
NoSQL不善于进行概念连接。
他们大多数人的方式是使用map / reduce。例如,在Mongo中,您可以编写map / reduce函数,它们实际上将为您提供连接功能。然而,你支付速度的价格。
但是如果你愿意让复杂的查询(不符合原始文档模型的东西)运行得慢一些,你可以完成你想要的任何事情。
您如何确定哪些查询需要快速以及哪些查询可能有点慢?再一次,我会指向UI。
建模的简单试验和错误确实帮助了我。我意识到这是一个蹩脚的建议,但这是真的。 =)
答案 1 :(得分:2)
您可以将描述字段设置为具有两个字段的对象数组:区域设置和文本。只需确保此数组的第一个成员始终是默认语言环境中的值。