【发布时间】:2013-10-14 10:32:53
【问题描述】:
我有一个简单的问题。表可以将其唯一的主键作为外键吗?
澄清一下。当我一直在创建表时,我有时会有一个包含多个键的表,其中一些是外键。例如:
create table Pet(
Name varchar(20),
Owner char(1),
Color varchar(10),
primary key(Name, Owner),
foreign key(Owner) referecnes Person(Ssn)
);
所以现在我想知道是否可以这样做:
create table WorksAs(
Worker char(1),
Work varcahr(30),
primary key(Worker),
foreign key(Worker) references Person(Ssn)
);
这将导致两个表具有完全相同的主键。这是应该避免的事情还是设计数据库的好方法?如果上述不是一个好的标准,我也会简单地将 Work 变量设为主键,这很好,但如果不需要,跳过它似乎更简单。
【问题讨论】:
-
我认为你的表 WorkAs 应该是一个关系表。这意味着您可以拥有一个包含 WorkPlaces 的表,一个包含 Workers 的表和一个表 WorksAs 以与 Worker->WorkPlace 建立关系。否则,为什么不使用同一张表(Worker)并添加带有 char Workplace 的列?但是回答你的问题,是的,你可以拥有它。
-
我会说很好。但是......为什么不将这些字段(在 WorksAs 中)直接移动到 Person 表中(在那里可以为空)?少了一张桌子。少一个加入。
-
首先,这只是我在提出这个问题时想到的一个不好的例子,因为它更容易解释我想知道的内容。其次,我想知道这一点的原因是因为我正在处理一个我们应该从我们的数据库中消除 NULL 值的任务。因此,如果我将 WorksAs 放在 Person 表中,我会遇到我不想要的可能 NULL 值的问题 :)
-
我跟着你,因为有很多数据使用不当,这是一个糟糕的情况,我想这就是你现在要远离的地方。无论如何,我个人会将它们移到(可为空的)另一个表中,正确命名将是可空字段的正确使用,而不是拆分表。我不知道你的全部故事,拆分表可能还有很多其他原因,所以不想在这里发表明确的声明。无论如何,您的问题似乎已经得到解答! :)
标签: sql