重用外键或创建新外键是否更正确?

时间:2014-03-25 10:21:59

标签: database

假设您有以下表格,其中包含字段:

供应商: 供应商ID(PK), 供应商状态, 供应商国家,

假设您想从定义的列表中捕获每个公司正在处理的单个项目。

是最正确的方法:

创建一个名为Supplier Project的新表,其中Supplier ID字段的副本作为外键,另一个字段称为Project ID。此表与Supplier ID字段上的供应商表具有一对一的关系。然后创建另一个名为Project的表,其中包含Project ID作为其主键的副本以及另一个名为Project Name的字段。看起来像是与连接表的一对多关系,虽然看起来很奇怪。

或者你应该在Suppliers表中创建一个单独的外键来引用?或其他什么?

似乎总有很多方法可以解决这些问题。感谢您的任何见解。

1 个答案:

答案 0 :(得分:1)

嗯,一方面,您有一个名为Supplier的实体类型,另一方面,您有一个名为Project的实体类型,因此供应商可能有零个或多个相关项目。

这意味着,从实体关系模型的角度来看,两种实体类型之间的关系和这种关系是0..n

这转化为关系数据模型,意味着三个表:

  • Supplier(pk),SupplierIDSupplierStatus组成的表格(SupplierCountry)。
  • Project(pk)和其他与项目相关的表格(ProjectID) 字段。
  • SupplierProjectSupplierID组成的表格(ProjectID),固定为外键和主键。

<强>更新

现在,正如您所说供应商仅在项目中工作,这意味着1..1关系。在这种情况下,您有三种选择:

  • 使用每种实体类型的自身相关属性创建两个表,并将PK从Supplier导入Project。这意味着项目必须始终有一个关联的供应商。

  • 使用每种实体类型的自身相关属性创建两个表,并将PK从Project导入Supplier。这意味着供应商必须始终拥有相关项目。如果供应商没有项目,并且由于FK不能为空,则不能代表这种情况。

  • 创建一个包含所有字段的表,您可以在其中使与项目相关的数据可以为空,以表示供应商没有关联项目的情况。无论如何,在这种情况下,最好采用第一种解决方案,以避免使用空值表。

更新2:

Case 1, in which each supplier always have one and only one associated project

最简单的方法是创建一个包含SupplierProject所有字段的表格。 ProjectID字段已经没有意义了。

Case 2, in which each supplier can have one and only one associated project
        (but also can have not associated projects)

您应该为Supplier创建一个表,为Project实体类型创建另一个表。 Project实体类型将继承SupplierID作为外键和备用键。这意味着项目必须始终有一个关联的供应商,因为AK不能为空。

如果您尝试删除某个关联项目的供应商,DBMS将不允许您这样做。

这也意味着必须先删除与给定供应商关联的项目,然后才能将新项目分配给此供应商,因为您不能将SupplierID继承的密钥留空,也不能在其他行中重复。< / p>