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

Database design 在NoSQL解决方案中支持多种语言?,database-design,localization,nosql,Database Design,Localization,Nosql,我们即将开始一个新的项目,我们将(希望)支持1000多个客户,因此我们正在研究架构。该应用程序的一个关键方面是支持多种语言(英语、西班牙语等,不限制语言数量)。我们在建模方面有很多经验,这是一个传统的RDBMS(Sql Server、Oracle等),但我们在NoSQL“建模”方面遇到了困难。在SQL模型中,我们将创建一个“文本”表,其中“语言”列指向一个包含所有不同语言的“语言”表。这样,所有文本都可以用所有支持的语言表示。考虑一个简单的例子: 表:类别 列:id(主键),已启用(Bool)

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

表:类别 列:id(主键),已启用(Bool)

表:类别描述 列:id(PK)、CategoryID(FK)、LanguageID(FK)、Description(Text)

表:语言 列:id(主键),已启用(Bool)

表:语言描述 列:id(主键)、DescriptionLanguageID(FK)、LanguageID(FK)、Description(文本)

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

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

表:事件 列:id(主键)、创建(日期)、类别id(FK)等

为了从这个表中获取信息,我将执行与之前相同的联接,并选择正确语言的description列。基本的东西,我们以前都做过

最后,我们得出了我的问题:我该如何在NoSQL数据库中正确地存储它

我已经研究了几个(糟糕的)解决方案:

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

    编辑:我们关注NoSQL有两个原因:

  • 业绩(比额表)
  • 动态模式(需要做大量工作才能在SQL中实现)

  • 有一段时间没有人问这个问题了,但我想为什么不=)

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

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

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

    我认为您暗示了使用SQL示例跨文档运行查询的能力。换句话说,如果您尽了最大努力创建了10种文档类型,并且进展顺利,然后突然意识到需要进行“加入”,那么您将遇到麻烦

    NoSQL不擅长进行概念连接

    他们中的大多数人都使用map/reduce。例如,在Mongo中,您可以编写map/reduce函数,这些函数本质上为您提供了连接功能。然而,你在速度上付出了代价

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

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


    此外,建模方面的简单尝试和错误也确实帮助了我。我意识到这是一个站不住脚的建议,但这是真的

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

    问题是否不清楚/不现实/愚蠢?完全没有回应,有点奇怪…谢谢你的回应。我明白你不关心正常化的观点;那很好。但很有可能我们会有超过1000个实体,每个实体有20个属性,描述语言为4-12种。。。所以在Sql中,我们有20*12的描述,但在NoSql中,我们有20*12*[数千]。这将开始在存储方面花费。。。不酷!:)我喜欢这种方法。这对以后的搜索很有好处。关于如何查询投影到所需语言的文档,有何评论?(如果所需的语言环境不存在,则返回默认语言环境)?我尝试使用$elemMatch,但如果没有具有查询的区域设置的对象,MongoDB将不会返回字段
    select c.id, cd.Description 
    from   Category c, Category_Descriptions cd 
    where  c.id = cd.CategoryID 
    and    c.Enabled = 1;