database-design - 多语言数据库的架构

标签 database-design localization multilingual

我正在开发一个多语言软件。就应用程序代码而言,可本地化性不是问题。我们可以使用特定于语言的资源,并拥有与其配合良好的各种工具。

但是定义多语言数据库模式的最佳方法是什么?假设我们有很多表(100 个或更多),每个表可以有多个可本地化的列(大多数 nvarchar 列应该是可本地化的)。例如,其中一张表可能包含产品信息:

CREATE TABLE T_PRODUCT (
  NAME        NVARCHAR(50),
  DESCRIPTION NTEXT,
  PRICE       NUMBER(18, 2)
)

我可以想到三种方法来支持“名称”和“描述”列中的多语言文本:

  1. 每种语言都有单独的列

    当我们向系统添加新语言时,我们必须创建额外的列来存储翻译后的文本,如下所示:

    CREATE TABLE T_PRODUCT (
      NAME_EN        NVARCHAR(50),
      NAME_DE        NVARCHAR(50),
      NAME_SP        NVARCHAR(50),
      DESCRIPTION_EN NTEXT,
      DESCRIPTION_DE NTEXT,
      DESCRIPTION_SP NTEXT,
      PRICE          NUMBER(18,2)
    )
    
  2. 包含每种语言列的翻译表

    不存储翻译后的文本,而是仅存储翻译表的外键。翻译表包含每种语言的一列。

    CREATE TABLE T_PRODUCT (
      NAME_FK        int,
      DESCRIPTION_FK int,
      PRICE          NUMBER(18, 2)
    )
    
    CREATE TABLE T_TRANSLATION (
      TRANSLATION_ID,
      TEXT_EN NTEXT,
      TEXT_DE NTEXT,
      TEXT_SP NTEXT
    )
    
  3. 包含每种语言行的翻译表

    不存储翻译后的文本,而是仅存储翻译表的外键。翻译表仅包含一个键,一个单独的表包含每种语言翻译的一行。

    CREATE TABLE T_PRODUCT (
      NAME_FK        int,
      DESCRIPTION_FK int,
      PRICE          NUMBER(18, 2)
    )
    
    CREATE TABLE T_TRANSLATION (
      TRANSLATION_ID
    )
    
    CREATE TABLE T_TRANSLATION_ENTRY (
      TRANSLATION_FK,
      LANGUAGE_FK,
      TRANSLATED_TEXT NTEXT
    )
    
    CREATE TABLE T_TRANSLATION_LANGUAGE (
      LANGUAGE_ID,
      LANGUAGE_CODE CHAR(2)
    )
    

每种解决方案都有优点和缺点,我想知道您对这些方法有什么经验,您有什么建议以及您将如何设计多语言数据库架构。

最佳答案

对于每个可翻译表都有一个相关的翻译表,您有何看法?

CREATE TABLE T_PRODUCT (pr_id int, PRICE NUMBER(18, 2))

CREATE TABLE T_PRODUCT_tr (pr_id INT FK, languagecode varchar, pr_name text, pr_descr text)

这样,如果您有多个可翻译列,则只需要一个连接即可获取它+,因为您没有自动生成 translationid,因此可以更轻松地导入项目及其相关翻译。

这样做的负面影响是,如果您有一个复杂的语言回退机制,您可能需要为每个翻译表实现该机制 - 如果您依赖某些存储过程来实现这一点。如果您从应用程序中执行此操作,这可能不会成为问题。

请告诉我您的想法 - 我也即将在下一次申请中就此做出决定。 到目前为止我们已经使用了您的第三种类型。

关于database-design - 多语言数据库的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/316780/

相关文章:

localization - 无法从 Lisp Portable AllegroServe 提供国际字符

ios - 如何从 Date() 中提取今天、昨天并使其像工作日和月份一样本地化?

c# - 从 .ToString ("c") 格式的数字中删除尾随小数

php - 如何将一维数组转换为二维数组

asp.net - 如何使 ASP.NET MVC 应用程序成为多语言版本?

mysql - 将我的数据结构存储在数据库中的最佳方式是什么?

mysql - 数据库规范化设计问题 : 2 tables sharing almost the same information

sql - 当列数据到达多种类型/误差范围时,如何设计 SQL 表?

mysql - 存储多个日期范围

android - 在不重新发布应用程序的情况下在 android 中添加新语言