4

我们即将开始一个新项目,我们将(希望)支持数千名客户,因此我们正在研究架构。该应用程序的一个关键方面是支持多种语言(英语、西班牙语等,对语言数量没有限制)。我们在建模这是一个传统的 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 数据库中?:)

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

  1. 仅存储代码,然后查找正确的描述运行时
  2. 将上次使用的描述与语言代码一起存储,然后在语言发生变化时更新(不同的用户)
  3. 将所有描述存储在同一个文档中
  4. 以活动语言存储代码的描述,然后在需要时将描述添加到新语言中(即,当以未使用的语言请求时)

所有这些解决方案都有很多缺点,需要大量的工作来实施和维护......所以,任何关于如何最好地解决这个问题的意见将不胜感激。

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

  1. 性能(规模)
  2. 动态模式(需要做很多工作才能在 SQL 中实现这一点)
4

2 回答 2

3

自从有人问这个问题以来已经有一段时间了,但我想为什么不 =) ...

根据我使用 NoSQL 的经验,您必须首先真正尝试忘记您的 RDMS 背景和对数据标准化的强烈愿望。有冗余数据是可以的。可以大量存储东西(即使它是多余的!)数据不一致也可以。换句话说,由于您可能会将语言描述存储在 5 个位置……因此可以让这 5 个位置在一段时间内有所不同。

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

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

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

NoSQL 不擅长进行概念连接。

他们中的大多数人这样做的方式是使用 map/reduce。例如,在 Mongo 中,您可以编写本质上为您提供连接功能的 map/reduce 函数。但是,您要为速度付出代价。

但是,如果您愿意让复杂的查询(不适合您的原始文档模型的事物)运行得慢一点,那么您可以完成任何您想做的事情。

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

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

于 2013-01-06T04:11:06.683 回答
3

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

于 2013-10-07T22:40:52.807 回答