Database design 设计数据库体系结构:DB用于两种不同的语言

Database design 设计数据库体系结构:DB用于两种不同的语言,database-design,localization,translation,Database Design,Localization,Translation,我有一个网站,应该有不同语言的相同内容的翻译。因此,它应该具有相同字符串的不同翻译的数据库条目。 它不仅仅是一个小网站,所以有很多不同的复杂数据结构 我有一个想法如何实现这一点。但我真的不喜欢它 我想引入一个额外的翻译表,在这个表中,我们计划存储不同语言的字符串字段 例如,对于包含三个字符串字段(name、shortDescr、fullDescr)的表项目,我将以下一种方式使用翻译表: 我将把name、shortDescr、fullDescr字段从string改为integer(包含从link

我有一个网站,应该有不同语言的相同内容的翻译。因此,它应该具有相同字符串的不同翻译的数据库条目。 它不仅仅是一个小网站,所以有很多不同的复杂数据结构

我有一个想法如何实现这一点。但我真的不喜欢它

我想引入一个额外的翻译表,在这个表中,我们计划存储不同语言的字符串字段

例如,对于包含三个字符串字段(name、shortDescr、fullDescr)的表项目,我将以下一种方式使用翻译表:

我将把name、shortDescr、fullDescr字段从string改为integer(包含从link(ID)到translationTxtID的链接)。不同的translationTxtID和lang字段将为每个字符串标记和语言定义唯一的字符串。
所以这个解决方案会奏效,但我正在寻找更优雅的解决方案。你能给我建议一个解决这个问题的办法吗

为什么不在表中有多个条目,每个lang对应一个条目?PK可以是ID和LangID的组合。对于上面的示例:

Project

ID, int
LangId, int
Name, varchar
shortDesc, varchar
Fulldesc, varchar
date, date
然后,您需要在代码中设置一个语言变量,并在查询中将其作为查询中的一个选项提供(我在这里使用SQL作为参考):


您可以在该特定会话的所有查询中保留langid。

为什么不在表中设置多个条目,每个lang对应一个条目?PK可以是ID和LangID的组合。对于上面的示例:

Project

ID, int
LangId, int
Name, varchar
shortDesc, varchar
Fulldesc, varchar
date, date
然后,您需要在代码中设置一个语言变量,并在查询中将其作为查询中的一个选项提供(我在这里使用SQL作为参考):

您可以将langid保存到该特定会话的所有查询中

你能给我建议一个解决这个问题的办法吗

不要使用整数键。事实上,这不是你自己发明的。只需使用
gettext
。你已经在几乎所有的操作系统上都有了它。这是一款快速、经过验证的软件,您无需编写

执行标准
gettext
模块为i18n所做的操作。(见附件)

  • 使用文本键

  • 选择一个区域设置(即“C”区域设置或编写软件的区域设置)

  • 将所有消息作为默认区域设置中的字符串放入“Project”表中

  • 使用原始字符串和要翻译的I18N语言环境将所有翻译放入“Translation”表中。是的,翻译表是由一个又大又长的字符串键入的。这在实践中非常有效,因为(1)您没有那么多字符串,(2)您没有经常查找它们,(3)您应该使用gettext,而不是自己滚动

  • 当您向用户呈现任何数据时,您将尝试选择以获取翻译。如果你找到了翻译,那就好了

    如果您没有找到翻译,那么您使用的密钥是默认字符串,这总比没有好。将异常记录在某个位置,并显示原始字符串

  • 你能给我建议一个解决这个问题的办法吗

    不要使用整数键。事实上,这不是你自己发明的。只需使用
    gettext
    。你已经在几乎所有的操作系统上都有了它。这是一款快速、经过验证的软件,您无需编写

    执行标准
    gettext
    模块为i18n所做的操作。(见附件)

  • 使用文本键

  • 选择一个区域设置(即“C”区域设置或编写软件的区域设置)

  • 将所有消息作为默认区域设置中的字符串放入“Project”表中

  • 使用原始字符串和要翻译的I18N语言环境将所有翻译放入“Translation”表中。是的,翻译表是由一个又大又长的字符串键入的。这在实践中非常有效,因为(1)您没有那么多字符串,(2)您没有经常查找它们,(3)您应该使用gettext,而不是自己滚动

  • 当您向用户呈现任何数据时,您将尝试选择以获取翻译。如果你找到了翻译,那就好了

    如果您没有找到翻译,那么您使用的密钥是默认字符串,这总比没有好。将异常记录在某个位置,并显示原始字符串


  • 我为每个包含字符串的父表使用本地化表。因此,如果您有一个表“Project”,那么您也会有一个表“Project\u Locale”。Project_Locale与Project+具有相同的主键,并添加了一个“Culture”字段。所有可本地化的字符串字段都在Project_Locale中,其他所有字段都在Project中。

    我为每个包含字符串的父表使用本地化表。因此,如果您有一个表“Project”,那么您也会有一个表“Project\u Locale”。Project_Locale与Project+具有相同的主键,并添加了一个“Culture”字段。所有可本地化的字符串字段都在Project\u语言环境中,其他所有字段都在Project中。

    我的选择是

    Project
    -------
    ProjectID (PK)
    Date
    
    ProjectLoc
    ----------
    ProjectID (FK)
    Lang
    Name
    ShortDesc
    FullDesc
    
    然后可以运行一个简单的查询,如

    SELECT Project.ProjectID, Date, Name, ShortDesc, FullDesc
    FROM Project
    LEFT JOIN ProjectLoc ON Project.ProjectID = ProjectLoc.ProjectID
    WHERE ProjectLoc.Lang = %CurrentLang%
    
    优点:优雅而简单
    缺点:大量表格

    我的选择是

    Project
    -------
    ProjectID (PK)
    Date
    
    ProjectLoc
    ----------
    ProjectID (FK)
    Lang
    Name
    ShortDesc
    FullDesc
    
    然后可以运行一个简单的查询,如

    SELECT Project.ProjectID, Date, Name, ShortDesc, FullDesc
    FROM Project
    LEFT JOIN ProjectLoc ON Project.ProjectID = ProjectLoc.ProjectID
    WHERE ProjectLoc.Lang = %CurrentLang%
    
    优点:优雅而简单

    缺点:在.net中有大量表

    我们使用的是由设计的sql本地化数据库


    在.net中,我们使用的是由设计的sql本地化数据库


    您也可以像这个用户一样研究使用XML:您也可以像这个用户一样研究使用XML:问题在于,如果表中有其他不可本地化的字段。然后,重复其他数据会导致维护问题。问题在于该表是否有其他不可本地化的字段。然后,您会重复其他数据,导致维护方面的麻烦。谢谢!我想