Database design 如何在关系数据库中建模多语言实体

Database design 如何在关系数据库中建模多语言实体,database-design,relational-database,multilingual,Database Design,Relational Database,Multilingual,如果我们要开发一个多语言应用程序,我们应该在资源文件或数据库中存储翻译吗 假设我们选择在数据库中执行此操作。在关系模型中是否有标准的方法来建模多语言实体 1.一张大的翻译桌 我们可以将所有翻译存储在一个表中,并对属性值使用语言中性键 个人(SSN,名,姓,生日) 翻译(key,langid,翻译) 2.每个实体一个翻译表 个人(SSN,生日) PersonML(SSN,LangId,名字,姓氏) 我更喜欢这种方法。这确实是一种1:N关系 问题 似乎无法使用多语言列构成主键 假设每个人都有一个唯一

如果我们要开发一个多语言应用程序,我们应该在资源文件数据库中存储翻译吗

假设我们选择在数据库中执行此操作。在关系模型中是否有标准的方法来建模多语言实体

1.一张大的翻译桌 我们可以将所有翻译存储在一个表中,并对属性值使用语言中性键

个人(SSN,名,姓,生日)

翻译(keylangid,翻译)

2.每个实体一个翻译表 个人(SSN,生日)

PersonML(SSNLangId,名字,姓氏)

我更喜欢这种方法。这确实是一种1:N关系

问题 似乎无法使用多语言列构成主键
假设每个人都有一个唯一的名字,那么(FirstName,LastName)可以用作主键

个人(,生日)

但是,在考虑使用多种语言时,(FirstName,LastName)无法识别一个人。
显然,我们不能添加LangId来形成主键

人物(LangId,生日)

在这种情况下,一个人将被存储在多个行中,而非键列将被复制

主键必须使用与语言无关的列吗?
当没有此类列时,我们是否使用替代项 有人告诉我,不应盲目使用代孕,我非常同意


更新1 在本例中,我假设FirstName和LastName要进行本地化

如果每个实体都有类似SSN的属性,那么第二种方法更有意义。
但是,如果某些有效主键包含要进行本地化的列,则它们可能会变得无效

另一个例子 每个公司都有一个唯一的名称,因此CompanyName可以用作主键

公司(公司名称,…)

说到本地化,公司名称不能用作主键。我们必须发明一些代码来代表公司

这是否意味着本地化不适合关系模型


更新2 3.1:N默认语言与其他语言之间的关系 用户可能会将公司表视为:

公司(公司名称英语、公司名称法语、公司名称西班牙语等)

当然也有重复的组,所以它打破了1NF

改进:

公司(CompanyNameEnglish,…)

CompanyNameML(CompanyNameEnglishLangId,CompanyName)

问题是,即使用户不需要,我们也必须提供默认(英文)名称。
一些用户可能提供英文名称,其他用户可能只提供法文名称。
这项规定是否过于做作

4.DBMS本地化支持 在他的评论中提到了这一点。
我会做更多的研究。

我被告知不应该盲目使用代孕,我非常同意。
我也同意这一点,盲目使用任何东西都不是明智的选择

然而,并非每次使用代理键时都是盲目的。 请记住,主键不是确保唯一性的唯一方法。大多数(如果不是所有的话)关系数据库都提供了唯一的约束和唯一的索引,应该明智地使用它们。 事实上,在翻译表中存储多语言数据时,使用代理键可能比使用自然键更好。为了更好地比较自然和替代关键策略

为了回答您的问题,我将为每个实体创建一个翻译表,只在主实体表中保留实体非文本数据(例如,在您的示例中,出生日期和性别),并在翻译表中保留文本数据,其主键由语言id和实体表主键组成。

请注意,在这种情况下,实体表的主键必须是非文本的,并且不依赖于语言

你的问题没有意义:如果你决定将你的翻译存储在“资源文件”中,那么这组资源文件就是数据库(或其中的一部分)

需要回答的更相关的问题是,例如:谁是翻译的所有者(即翻译是否是软件包的组成部分-最终用户是否可以自定义)?这些问题的答案将决定您的翻译是否可以作为二进制文件附带的资源文件


我没有给出任何真正的答案,因为唯一能知道决定因素的人是你。我只是指出了需要回答的更深层次的问题,这将使问题变得更清楚。

从您的示例中可能重复的内容完全不清楚您的数据模型中有哪些内容需要翻译。相反,它看起来更像是一个类似“什么是好的主键”的问题。请编辑您的文章,并提供有关您的数据模型和要本地化的列的特定信息。假设SSN代表社会保险号(并且应该是唯一的),它似乎是主键的自然选择。在翻译表中,只需向其添加语言标识符即可创建主键。(a)如果您想要RDB,则无法发明代码,这些键必须由数据组成(b)本地化与RM无关,这是一个实现问题。获得一个SQL平台,现在本地化是标准的(c)如果你有本地化“问题”,那是因为你没有[i]商用服务器。您为非SQL编写的任何代码都是不可移植的,