多语言设计数据库。 双重独特的关键引用外键
我必须让我的数据库能够翻译一些术语。 这里是我的数据库的基本绘制:
第一张桌子(还有更多像它):
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必须引用表对象中的外键。
有可能吗? 如果不是,还有什么替代方案?
这是可能的,因为您可以在大多数数据库中创建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.创建表对象(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);
首先,在TRANSLATIONS表中,“name_id”是UNIQUE,我很惊讶你是如何在此列中插入重复条目的。 为第三个表提供正确的数据。
在TRANSLATIONS表中,name_id不应包含重复值。 这里TRANSLATIONS表中只有一列(包含约束条件)可能包含重复条目,它是LANGUAGE_ID,并且由于它在父表LANGUAGE中已经是唯一的,所以它不具有唯一性。
但是,如果您在此处使列LANGUAGE_ID唯一,那么它将只允许那些在LANGUAGE表中的条目数,即如果LANGUAGE表包含2个条目,则您只能在TRANSLATIONS表中插入2行,因为我已经说过没有受益于这样做。
上一篇: Database for multilanguage design. double unique key referece to foreign key