代码之家  ›  专栏  ›  技术社区  ›  Eric Petroelje

设计本地化数据库架构[重复]

  •  12
  • Eric Petroelje  · 技术社区  · 16 年前

    可能重复:
    Schema for a multilanguage database

    第一个选项是众所周知的table\u name,table\u name\u ml type选项:

    TABLE Category (
       ID int,
       ParentID int,
       Name varchar(50),
       Description varchar(255)
    )
    
    TABLE Category_ML (
       ID int,
       CategoryID int,
       LocaleID int,
       Name varchar(50),
       Description varchar(255)
    )
    

    第二个选项是根本不在基表中存储文本,而是存储一个可用于在其他地方查找实际本地化文本的标记,如下所示:

    TABLE Category (
       ID int,
       ParentID int,
       NameToken varchar(50),
       DescriptionToken varchar(50),
    )
    
    // Tables in a separate content management type system
    TABLE Content (
       ID int,
       Token varchar(50)
    )
    
    TABLE Translation (
       ID int
       ContentID int,
       LocaleID int,
       Value text
    )
    

    我喜欢第一种选择,因为它是经过实践检验的,但第二种选择似乎还有很多其他优点:

    1. 我所有的文本/本地化内容都放在一个地方(使翻译更容易)。
    2. 服务层实际上不需要关心区域设置。

    因为我以前从未见过这样的设计,我想我一定错过了什么。有什么好的理由不这样设计吗?或者也许有一个更好的选择,我没有想到?

    2 回复  |  直到 9 年前
        1
  •  3
  •   Arthur Thomas    16 年前

    首先我要说的是,我以前没有处理过本地化问题,所以这实际上只是我的观点,不是基于经验。

    我喜欢你的第二个选择。就DB而言。。它的数据和访问/操作数据的方法。在这种情况下,所有的数据都在那里,您将主要阅读这些数据,并有一个很好的方法获取它们。在这两种情况下,您可以回答相同的问题。我自己更喜欢第二种选择,因为它可以减少到处都是疯狂的桌子。为了翻译的特殊目的,你在附近放了一张桌子。您可以重用它(不需要为以后的升级创建更多的表),并且它可以保持完整性。如果在某个地方有意义的话,你甚至可以重用名称。比如,如果你把“壁炉舞”作为一个类别,或者作为其他地方的最爱。

    如果可能的话,我喜欢将相关数据放在一个表中,而不是将与“翻译”相关的数据放在多个地方。

    唯一可能失败的地方是,如果你对需要翻译的东西有更多的名称和描述。也许你有名字,描述,代码,神奇的单词,愚蠢的昵称,等等。虽然您可以通过在相关表中添加更多的NameToken并重用Name来解决这个问题,但这有点像黑客。

        2
  •  -1
  •   Serhat Dincel    15 年前

    有一个额外的选择,我想我会打赌!

    • 完全分离数据库!

    理由(赞成):

    • 脚手架(生成的表示层)
    • 简易Orm

    • 您必须解决唯一ID问题(复制)
    • 您需要同步架构和非本地化数据