主键和外键

时间:2011-07-05 13:59:53

标签: database-design primary-key normalization

简单的问题,似乎无法在Google上找到答案。我正在规范数据库,我正在将其中一个表转换为第二范式。问题是:表的主键是否也可以是同一个表中的外键?

如果它更容易理解,我试图消除表中的部分依赖(但这可能是显而易见的,因为我提到了第二范式)。

我有表JobItem,看起来像这样:

Job No (PK), Item Code (PK), PO Num, Item Description, Item Type, Vendor, Job Name

Job Name部分取决于密钥的Job No组件。 Item Description, Item Type and Vendor取决于Item Code组件。 PO Num取决于整个密钥。

我要问的是,一旦我将部分依赖关系删除到自己的表中,我的密钥的组件是否也会成为引用新表的foriegn密钥?

编辑:充实示例更具相关性。

2 个答案:

答案 0 :(得分:2)

这样的东西?

enter image description here

答案 1 :(得分:1)

如果您发布表格的DDL,您将获得更好的答案。 (发布CREATE TABLE脚本。)根据经验,始终为样本数据发布DDL和INSERT语句。

  

问题是:可以是主键   表也​​是外键   同桌?

是的,但这并没有说明你的情况。您的主键位于一个表中(表B),而您的外键位于不同的表中(表A)。

自引用外键,其中表A中的外键引用表A中的候选键,相对不常见。也就是说,引用其他表的外键比引用它们自己的表的外键更常见。

事实上,您可以在SO上找到相当多的设计 - 而不是只是在SO上 - 当他们真的不应该使用自引用外键时。这是发布DDL的另一个好理由。

<强>后来

  

我问的是,一旦我脱光了   部分依赖于他们的   自己的表,将我的组件   钥匙也变成了钥匙   参考新表?

是。在极少数情况下,多列候选键的列实际上需要完全引用不同的表。但在你的情况下,看起来你是对的 - 你的密钥列应该引用新表中的主键。