当前位置: 首页 > 面试题库 >

多语言数据库的架构

方和宜
2023-03-14
问题内容

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

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

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

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

每种语言的单独列

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

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

带有每种语言列的翻译表

代替存储翻译的文本,仅存储翻译表的外键。翻译表包含每种语言的列。

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
)

每种语言都有行的翻译表

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

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

每种解决方案都各有利弊,我想知道您在使用这些方法时的经验,您的建议以及如何设计多语言数据库架构。


问题答案:

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

创建表T_PRODUCT(pr_id int,价格NUMBER(18,2))

创建表T_PRODUCT_tr(pr_id INT FK,语言代码varchar,pr_name文本,pr_descr文本)

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

不利的一面是,如果您具有复杂的语言回退机制,则可能需要为每个转换表实现该功能-如果您依靠某些存储过程来做到这一点。如果您通过应用程序执行此操作,则可能不会出现问题。

让我知道您的想法-我还将就下一个应用程序做出决定。到目前为止,我们已经使用了您的第三种类型。



 类似资料:
  • 我们正忙于一个需要支持多种语言的CakePHP项目。但有一个问题....有些页面不支持其他语言。因此,有西班牙网页,需要隐藏的意大利版本的网站。在CakePHP中对此有什么更好的解决方案? 只要您切换语言,我们就可以切换数据库,但问题是,作为用户,我们将错过重要的数据,如果我们这样做的话。如果只搜索西班牙文、意大利文、德文、英文、荷兰文和瑞典文的文章,可能会使数据库负荷过重。或者如果我们索引语言栏

  • 问题内容: 我有一个需要支持多语言界面的应用程序,确切地说是五种语言。对于接口的主要部分,可以使用标准的Res​​ourceBundle方法来处理。 但是,数据库包含许多表,这些表的元素包含人类可读的名称,描述,摘要等。必须有可能以所有五种语言输入每一个。 虽然我想我可以简单地在每个表上都有字段 我认为在编写代表每个表的bean时,这会导致大量的很大程度上相同的代码。 从纯粹面向对象的角度来看,解

  • 问题内容: 我知道一个问题已经得到广泛讨论,但是我认为仍有一个方面需要澄清。 我正在创建一个具有多语言数据库的Web应用程序,我已经找到了一些很好的实践文章(例如 this), 因此,我决定使用一个包含项目ID的主表,以及一个包含每个项目的翻译的表,例如 要么 等等。 现在我在做什么?我只是从数据库中获取所有翻译的项目,然后遍历每个翻译,以根据当前用户的本地来查找正确的翻译,如果找到正确的本地,则

  • 主要内容:1. 数据定义语言,2. 数据操作语言,3. 数据控制语言,4. 事务控制语言DBMS具有适当的语言和接口来表达数据库查询和更新。 数据库语言可用于读取,存储和更新数据库中的数据。 数据库语言的类型 1. 数据定义语言 DDL代表数据定义语言。它用于定义数据库结构或模式。 用于在数据库中创建模式,表,索引,约束等。 使用DDL语句,可以创建数据库的框架。 数据定义语言用于存储元数据的信息,如表和模式的数量,它们的名称,索引,每个表中的列,约束等。 以下是DDL下的一些任务:

  • 问题内容: 这个问题已经在这里有了答案 : 8年前关闭。 可能重复: 多语言数据库的架构 这是一个例子: 问题: 每种新语言都需要修改表结构。 这是另一个例子: 问题是: 每种新语言都需要创建新表,并且每个表中都有“价格”字段重复。 这是另一个例子: 问题: 难吗? 问题答案: 您的第三个示例实际上是通常解决问题的方式。努力,但可行。 从翻译表中删除对产品的引用,然后将翻译的引用放在您需要的地方(

  • 问题内容: 我在使用JPA / Spring遇到一个特定问题时遇到了一些麻烦: 如何为实体动态分配架构? 我们有属于模式AD的TABLE1和位于BD下的TABLE2。 架构可能不会在注释属性中进行硬编码,因为它取决于环境(Dev / Acc / Prd)。(接受的模式是S1A和S2A) 我该如何实现?是否可以指定这样的占位符: 以便根据驻留在环境中的属性文件替换架构? 干杯 问题答案: 我有一个相