数据库规范化:外键=主键?

时间:2015-01-12 07:31:39

标签: sql

我有一个已经存在的表“位置”

  • PositionID(PK)int
  • PositionText
  • ...

现在我必须创建一个新表“PositionComment”(我不允许编辑表位置,所以我必须创建一个新表)。 关系是1:0..1(它是通过代码获得的,1个位置只能有1个注释)。

所以我需要在这个新表中有一个主键 - 但是:

关于规范化规则:

我是否必须使外键=主键,因为它是1:0..1 e.g:

  • PositionID(PK,FK到位置表)
  • CommentText

OR

我是否必须制作自己的主键 e.g:

  • CommentID(PK)
  • PositionID(FK到位置表)
  • CommentText

不同的是,在第一个建议中,我在第二个表中使用不同的PK作为PK ...但在第二个建议中我有一个双标识符,因为CommentID和PositionID对于1行是唯一的...

如何为规范化规则做到这一点以及为什么?

2 个答案:

答案 0 :(得分:3)

你是绝对正确的,要实现1-1关系,你通常应该考虑将它们合并到同一个表中。如果你有充分的理由不这样做,强制执行1-1关系的一个好方法是使用外键作为引用表中的主键或备用键。

答案 1 :(得分:0)

Please take a look at this

似乎其他人之前曾问过类似的问题。

  

外键几乎总是"允许重复,"这将使它们不适合作为主键。

     

相反,找到一个唯一标识表中每条记录的字段,或添加一个新字段(自动递增整数或GUID)作为主键。

     

唯一的例外是具有一对一关系的表,其中链表的外键和主键是同一个。

但你也应该考虑这个:

  

由两个外键组成的复合主键对于实现多对多关系也非常好。