2010-09-20 62 views
0

两个表如下:数据库设计外键是在我的数据库

[Employee] Table: 
Id (Primary Key, Autoincrement) 
FirstName 
LastName 
Status 

[Status] Table: 
Status (Primary Key) 

状态为下列之一:“全职”“承包商”“终止”

应该如何[雇员] .STATUS参考[Status] .Status作为外键?我看到这样的方法有两种:

  1. [雇员] .STATUS直接指向[状态] .STATUS
  2. 我添加ID列[状态]表中,并使其PK /自动增量。然后[Employee] .Status指向[Status] .Id。这意味着我必须进行连接才能获取状态文本。

其他表也可能引用状态表。两种方法之一是“正确的”做事方式还是设计问题?

+0

选项2. maintanability更复杂的表格第三种选择 - 为下面回答说。 – RPM1984 2010-09-20 00:53:08

+1

几个小时前偶然讨论过的同一个主题:[关系数据库设计问题 - 代理键或自然键?](http://stackoverflow.com/questions/3747730/relational-database-design-question-surrogate -key-or-natural-key) – 2010-09-20 00:58:27

+1

[主键的设计标准是什么?](http://stackoverflow.com/questions/3632726/what-are-the-design-criteria-for-primary - 键) – APC 2010-09-20 01:03:51

回答

4

这基本上是一个设计问题,但通常更好的方法是在状态表中添加一个ID字段。这使您可以更改状态值(拼写更正,语言翻译,更改术语以澄清含义等),而无需更新引用它的表中的数据。

此外,如果链接到字符串字段,则链接字段需要足够的空间来存储最长的状态字符串。链接到ID意味着你只需要在链接字段中存储一个整数(或最坏的情况下,一个GUID)。

+0

完美,这正是我需要的。目前无法接受您的答案 - 5分钟。 – Harper 2010-09-20 00:56:38

+1

如果Status基本上是一个具有少量值的静态查找表,那么您可能希望使用较小的数据类型作为它的id,而不是像在Employee这样的表中使用的那样,您希望允许更多行。一个字节会有很多不同的状态值。 – 2010-09-20 01:52:14

0

在要同时删除记录和更新名称,而不会丢失参考会像

[Employee] Table: 
Id (Primary Key, Autoincrement) 
FirstName 
LastName 
StatusNumber 

[Status] Table: 
Id (PK) 
Number 
Name 
+0

我不明白你为什么建议从一个不属于状态表中的主键的字段加入Employee到Status?看起来像是一个多余的领域,并且有错误的风险,没有任何好处。因此,状态表中的两行可能具有相同的数字。如果您通过约束来阻止这种情况,那么与仅使用Id相比,这有什么不同? – 2010-09-20 01:48:45