2013-10-14 82 views
1

我只是有一个简单的问题。一张表是否只有主键作为外键?外键可以唯一主键

澄清。当我创建表时,我有时会有一个带有多个键的表,其中一些是外键。例如:

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变量设置为主键,这样可以,但是如果不需要,跳过它似乎更简单。

+0

我觉得你的表WorkAs应该是一个关系表的空间。这意味着您可以使用WorkPlaces的表格,例如带有Workers和Table WorksAs的表格与Worker-> WorkPlace建立关系。否则,为什么你不使用同一个表(Worker)并且将该列添加到char Workplace中? 但回答你的问题,是的,你可以拥有它。 –

+0

我会说它非常好。但是......为什么不直接将这些字段(在WorksAs中)移动到Person表中(在那里可以为空)?少一桌。少加入一个。 –

+0

首先,这只是我提出这个问题时遇到的一个不好的例子,因为解释我想知道的更容易。其次,我想知道这个的原因是因为我正在处理一个任务,我们应该从我们的数据库中消除NULL值。所以,如果我把人工表格中的WorksAs我会有可能的NULL值,我不想要的问题:) –

回答

1

是的。由于以下原因。

  1. 使它们成为主键将强制唯一性(而不是暗示它)。
  2. 主键可能会被聚集(取决于dbms),这会提高某些查询的性能。
  3. 它可以节省加入了独特的约束在某些DBMS还创建唯一索引
1

是的,你可以这样做。但是你需要小心,因为外键可以有NULL值,而Primary不能。

+0

虽然这确实如此,但OP特别询问“表可以只有主键作为外键吗?”,所以我猜(他)他也会向细节表添加一个主键约束。 –

+0

够公平..但是我自己在mysql的时候,我首先想到的是,Jesper可能会面临NULL值的问题,结果证明这是正确的。 –