小编典典

多语言数据库的架构

all

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

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

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

我可以想到三种方法来支持 NAME 和 DESCRIPTION 列中的多语言文本:

  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)
)
  1. 带有每种语言列的翻译表

不存储翻译文本,只存储翻译表的外键。翻译表包含每种语言的列。

    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
)
  1. 每种语言都有行的翻译表

不存储翻译文本,只存储翻译表的外键。translations 表只包含一个键,一个单独的表包含一个用于每种语言翻译的行。

    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)
)

每种解决方案各有利弊,我想知道您对这些方法有何经验,您有什么建议以及您将如何设计多语言数据库模式。


阅读 215

收藏
2022-05-10

共1个答案

小编典典

您如何看待每个可翻译表都有一个相关的翻译表?

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

CREATE TABLE T_PRODUCT_tr(pr_id INT FK,语言代码 varchar,pr_name 文本,pr_descr 文本)

这样,如果您有多个可翻译列,则只需要一个连接即可获得它+,因为您没有自动生成 translateid,因此将项目及其相关翻译一起导入可能会更容易。

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

让我知道你的想法——我也即将为我们的下一次申请做出决定。到目前为止,我们已经使用了您的第 3 种类型。

2022-05-10