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

时间:2014-09-18 12:37:56

标签: sql database-design localization foreign-keys unique-constraint

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

第一张表(还有更多喜欢它):

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必须引用表对象中的外键。

有可能吗?如果不是,那么替代方案呢?

3 个答案:

答案 0 :(得分:0)

可以在大多数数据库中创建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);

答案 1 :(得分:0)

使用以下替代方法...执行按顺序。
1.创建表对象(object_id number(10)主键,object_name varchar(50));
2 .create table language(language_id number(10)primary key,language_name varchar(20));
3.创建表转换(translation_id number(10)主键,translation varchar(50),object_id number(10), language_id number(10),foreign key(object_id)引用object(object_id),外键(language_id)引用语言(language_id));
4. alter table translation添加唯一(object_id,language_id);

答案 2 :(得分:-1)

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