我们即将开始一个新项目,我们将(希望)支持数千名客户,因此我们正在研究架构。该应用程序的一个关键方面是支持多种语言(英语、西班牙语等,对语言数量没有限制)。我们在建模这是一个传统的 RDBMS(Sql Server、Oracle 等)方面拥有丰富的经验,但是在 NoSQL 的“建模”方面我们正在苦苦挣扎。在 SQL 模型中,我们将创建一个“文本”表,其中一个“语言”列指向一个包含所有不同语言的“语言”表。这样,所有文本都可以用所有支持的语言表示。考虑一个简单的例子:
表:类别列:id (PK)、Enabled (Bool)
表:Category_Descriptions 列:id (PK)、CategoryID (FK)、LanguageID (FK)、Description (Text)
表:语言列:id (PK)、Enabled (Bool)
表:Language_Descriptions 列:id (PK)、DescriptionLanguageID (FK)、LanguageID (FK)、Description (Text)
因此所有语言都将存储在 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;
当然,类别本身并不是很有用。它将是另一个实体的一部分,例如事件报告:
表:事件列:id (PK)、Created (Date)、CategoryID (FK) 等。
要从此表中获取信息,我将执行与以前相同的连接并选择正确语言的描述列。基本的东西,我们以前都做过……
最后我们遇到了我的问题:我到底如何将它正确地存储在 NoSQL 数据库中?:)
我看过几个(坏的)解决方案:
- 仅存储代码,然后查找正确的描述运行时
- 将上次使用的描述与语言代码一起存储,然后在语言发生变化时更新(不同的用户)
- 将所有描述存储在同一个文档中
- 以活动语言存储代码的描述,然后在需要时将描述添加到新语言中(即,当以未使用的语言请求时)
所有这些解决方案都有很多缺点,需要大量的工作来实施和维护......所以,任何关于如何最好地解决这个问题的意见将不胜感激。
编辑:我们正在研究 NoSQL 有两个原因:
- 性能(规模)
- 动态模式(需要做很多工作才能在 SQL 中实现这一点)