设计本地化数据库模式

时间:2010-01-12 02:54:31

标签: database-design localization

  

可能重复:
  Schema for a multilanguage database

我正在开发一个我计划以多种语言提供的Web应用程序。在设计数据库时,我会在两种不同的方式之间来回传递,以便在数据库中存储本地化描述和诸如此类的内容。

第一个选项是众所周知的table_name,table_name_ml类型选项:

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
)

这里的想法是内容和转换表将保存数据库中许多不同实体的本地化文本。服务层将仅使用标记返回基础对象,视图层将使用内容/转换表查找实际文本值 - 这将被高度缓存。内容/翻译表还将用于存储其他CMS类型内容(网页上的静态文本等)

我喜欢第一个选项,因为它尝试过并且是真的,但第二个选项似乎还有很多其他优点:

  1. 我的所有文字/本地化内容都在一个地方(使翻译更容易)。
  2. 服务层实际上并不需要关心区域设置。
  3. 通过不必加入一堆ML类型表来简化查询。
  4. 由于我之前从未见过这样的设计,我认为我必须遗漏一些东西。有没有好的理由不以这种方式设计呢?或者也许有一个我没有想过的更好的选择?

2 个答案:

答案 0 :(得分:3)

我首先会说我之前没有处理本地化,所以这只是我的意见而不是基于经验。

我喜欢你的第二个选择。就数据库而言......它的数据和访问/操纵数据的方式。在这种情况下,所有数据都在那里,你将主要阅读它并有一个很好的方法来实现它。您可以在两种情况下回答相同的问题。我本人更喜欢第二种选择,因为它减少了疯狂的桌子。为了翻译的具体目的,你要保留一张桌子。您可以重复使用它(不再为以后的升级创建更多表)并保持完整性。你甚至可以重用名字,如果它在某个地方有意义的话。就像你有'Mantequilla'作为一个类别和其他地方的喜欢。

我喜欢在可能的情况下将相关数据放在一个表格中,并且没有与多个地方的“翻译”相关的数据。

唯一可能失败的地方是,如果您不仅仅需要翻译的名称和说明。也许你有一个项目的名称,描述,代码,魔术字,傻昵称等。虽然你可以通过在相关表中添加更多NameTokens并重用Name来解决这个问题,但这有点像黑客。

只需确保模型满足您的需求,它应该可以正常工作。如果特定表格稍后需要,您可以随时输入特殊的转换表。尽管混合解决方案可能令人困惑,但这与创建大量表格不同。最好找到一种方法并尝试坚持下去。

答案 1 :(得分:-1)

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

  • 完全分离数据库!

理由(PROS):

  • Pyhsically seperated本地化数据库
  • 脚手架(生成的演示图层)
  • Easy Orm

CONS:

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