多语言设计数据库。对外键的双重唯一键引用

Posted

技术标签:

【中文标题】多语言设计数据库。对外键的双重唯一键引用【英文标题】:Database for multilanguage design. double unique key referece to foreign key 【发布时间】:2014-09-18 12:37:56 【问题描述】:

我必须让我的数据库能够翻译一些术语。 这是我的数据库的基本图:

第一张桌子(还有更多类似的):

create table objects
id int PRIMARY KEY,
name varchar(50),
name_id int FOREIGN KEY,

第二张桌子:

create table language
language varchar(20)
language_id PRIMARY KEY

第三张表:

create table translations
language_id FOREIGN KEY,
name_id UNIQUE KEY,
translation varchar(50)

看起来像这样:

对象:

id | name | name_id
___|______|________
1  |apple |1

语言:

language_id | laguage
____________|________
1           | ENG
____________|________
2           | DEU

翻译:

language_id | name_id | translation
____________|_________|____________
1           | 1       | apple
____________|_________|____________
2           | 1       | apfel    

现在,翻译中的两个列 language_id 和 name_id 都必须是唯一的。但只有一个,name_id 必须引用表对象中的外键。

有可能吗?如果没有,还有什么办法?

【问题讨论】:

我在 Oracle 中收到的错误消息:确保引用列与被引用列匹配。 【参考方案1】:

这是可能的,因为您可以在大多数数据库中创建 UNIQUE 约束:

-- Add unique constrain on two columns
ALTER TABLE TRANSLATIONS 
    ADD CONSTRAINT unq_translations UNIQUE (language_id, name_id);
-- Add foreign key constrain.
ALTER TABLE TRANSLATIONS 
    ADD CONSTRAINT fk_translations_name FOREIGN KEY (language_id, name_id) REFERENCES OBJECTS(language_id, id);

【讨论】:

不幸的是它不起作用。我在 Oracle 中收到一条消息,即 FK 无法引用非主键或唯一键的内容。 如果您将尝试的内容与错误消息一起添加到您的问题中,这将有所帮助。【参考方案2】:

使用以下替代方法...按顺序执行。 1. 创建表对象(object_id number(10) 主键,object_name varchar(50)); 2. 创建表语言(language_id number(10) 主键,language_name varchar(20)); 3. 创建表翻译(translation_id number(10) 主键,translations varchar(50),object_id number(10),language_id number( 10)、外键(object_id)引用对象(object_id)、外键(language_id)引用语言(language_id)); 4. alter table translation add unique(object_id, language_id);

【讨论】:

我认为你没有得到我想要做的事情。首先,表 OBJECTS 上的 PrimaryKey 没有意义。如果您正确阅读了我的问题,您就会知道需要翻译的表格比这个要多。而且这张表里已经有PrimaryKey了,我觉得很明显。【参考方案3】:

首先,在 TRANSLATIONS 表中,“name_id”是唯一的,我很惊讶您是如何在该列中插入重复条目的。为第三个表提供正确的数据。 在 TRANSLATIONS 表中,name_id 不应包含重复值。 在这里,TRANSLATIONS 表中只有一列(有约束)可能包含重复条目是 LANGUAGE_ID,使其唯一没有任何好处,因为它在其父表 LANGUAGE 中已经是唯一的。但是,如果您在此处使 LANGUAGE_ID 列唯一,它将仅允许 LANGUAGE 表中的那些条目数,即如果 LANGUAGE 表包含 2 个条目,您将被允许在 TRANSLATIONS 表中仅插入 2 行,AS我已经说过这样做没有好处。

【讨论】:

在 TRANSTLATION 表中,列 name_id 必须包含重复值,因为每个对象都必须翻译成两种语言。 @PRO_gramista :所以不要让它独一无二。您在问题中说过两列都必须是唯一的。 是的,这些列必须是唯一的,或者换句话说:它们必须是唯一的。 你说这必须是唯一的,并且会包含重复的条目,这怎么可能? 它们都是独一无二的,但只有在一起。这意味着每个单词只翻译一次英文或德文。 language_id 和 name _id 都是唯一的

以上是关于多语言设计数据库。对外键的双重唯一键引用的主要内容,如果未能解决你的问题,请参考以下文章

多语言系统的数据库设计

Magento 多语言 - 语言的双重变化导致 404(或如何在商店而不是视图中更改语言)

asp.net MVC 多语言设计

asp.net MVC 多语言设计

asp.net MVC 多语言设计

asp.net MVC 多语言设计