2012-05-14 59 views
0

我正在构建员工数据库,emp_person表(名,国籍,性别,...。etcc信息)和emp_contract表(雇用,合同类型,工资...)。我想知道在哪里分配主键,这是最佳做法?分配Pk和FK

回答

1

在您的设计中,创建名为Emp_Id的代理键(AutoNumber)并将其定义为emp_person表的主键。将数据存储在emp_contract表中时使用相同的密钥。

在数值列上创建的主键是嵌套练习。如果没有可以唯一识别记录的列,那么我们在表中创建一个代理键。

我遵循几个原则:

  1. 主键应该是必要的小。因为数字类型以比 字符格式更紧凑的格式存储,所以首选数字类型 。这是因为大多数主键在另一个表中都是外键 以及在多个索引中使用。 您的密钥越小,索引越小,您将使用的高速缓存 中的页面越少。
  2. 主键不应该改变。更新一个主键应该是 总是不可能的。这是因为它最有可能在多个索引中使用 并用作外键。单个主键更新 可能会导致更改的连锁效应。

关于代理vs自然键我指的是上面的规则。如果自然键很小并且永远不会改变,它可以用作主键。如果自然键很大或可能改变,我使用代理键。如果没有主键,我仍然会生成一个代理键,因为经验表明,您将始终将表添加到您的模式,并希望您将pk放在适当的位置。

阿曼达,为您的评论

解决“我的问题是我已经有nvarchar的PK(SQL Server 2008中)的老员工表,我想创建其他两个表,但改变PK到数后它已经连接到许多与FK关系的表,我正打算从PK字符(序列号部分)中取一个子字符串,并将它作为新表中的PK ...但我有近12条记录重复具有相同的唯一序列号,我想更新主键并将更新级联到所有FK表...但是我得到了主键约束的iolation。请帮助我“

创建一个新表与旧的和新的PK值。在两列上放置唯一的约束,以确保您迄今尚未破坏任何内容。

禁用使用此密钥作为PK或FK的所有表的约束。

针对所有表运行更新以将旧值修改为新值。

启用PK,然后启用FK。

+0

伟大的答案 - 我见过的应用程序,他们试图使用'应该'是独一无二的,如美国社会保险号/纳税人ID,作为主键,但当人们意识到他们写了错误的SSN或有人打错了,它必须改变。 – nvuono

+0

在这种情况下,他们也有自动编号和时间戳字段,所以没有两个记录不能相同。 –

+0

谢谢你4你的答案,我的问题是我已经有一个旧的员工表与nvarchar PK(SQL Server 2008),我想创建另外两个表,但改变后的PK号码,它已经连接到许多表与FK关系。我打算从PK字符(序列号部分)中取出一个子字符串,并将其作为新表中的PK ...。但我有几乎12个记录重复使用相同的唯一序列号,我想更新主键并将更新级联到所有FK表...但是我得到了主键约束的iolation。请帮我 – Amanda