【发布时间】:2018-06-26 13:08:27
【问题描述】:
我有一些 事物s 有 0-* 的名称,有任意数量的语言s:
CREATE TABLE Things(
thing_id INT PRIMARY_KEY,
thing_proprty INT);
CREATE TABLE ThingNames(
thing_name_id INT PRIMARY_KEY,
thing_id INT,
language CHAR[2],
name VARCHAR[64] UNIQUE,
FOREIGN KEY (thing_id) REFERENCES Things(thing_id));
这些东西在许多字段中都是相关的,并且在每个字段中,每种语言都有 0-1 个 CanonicalName。直接的方法是
CREATE TABLE Fields(
field_id INT PRIMARY_KEY,
name VARCHAR[64])
CREATE TABLE CanonicalNames(
thing_id INT
field_id INT
canonical_name_id INT
FOREIGN KEY (thing_id) REFERENCES Things(thing_id),
FOREIGN KEY (field_id) REFERENCES Fields(field_id),
FOREIGN KEY (canonical_name_id) REFERENCES ThingNames(thing_name_id));
但这错过了 0-1 约束,这将是 field_id 以及 ThingNames 的 thing_id 和 language 列的唯一性约束由 canonical_name_id 引用。在 CanonicalNames 中包含所有列作为外键当然是多余且容易出错的,那么有没有办法在表之间施加唯一性约束?或者这里有我没有看到的更好的解决方案吗?
【问题讨论】:
-
你的意思是 UNIQUE(thing_id,name) 在 ThingNames 中吗?
-
不完全。由于事物的每种语言可能有 0-* 个名称,但每个字段和语言只有 0-1 个规范名称,因此我不能在 ThingNames 中施加唯一性约束。
-
样本数据确实有助于解释这些关系。数据库标签也很有用。
标签: sql foreign-keys unique-constraint