0

给定一个表(联系人),它可以应用于存储在不同表中的数据库中的不同项目(雇主、教堂、医院、政府团体等),当最后利用这个单一的联系人表时,我发现存在将联系人关联回一个特定“项目”的两种选择

  • 每个具有外键关联的“项目”类型都有一列,这会导致表格如下所示:
  contactID empID     churchID  hospID    govID     conFN     conLN     ...
  • 一列表示“项目”的类型(fkName),一列表示对应于该类型项目的值(fkValue)。这会生成一个如下所示的表格:
  contactID fkName    fkValue   conFN     conLN     ...

第一个意味着在 X 个可能的外键中,X-1 将为 NULL,但我得到了硬关联外键的优点。

第二个意味着我可以将 fkName 和 fkValue 设置为 NOT NULL,但我没有得到 DB 支持的外键的优势。

最终,是否有一个“正确”的答案?还有其他我没有考虑过的优点/缺点(性能、安全性、增长/扩展)吗?

4

3 回答 3

2

第二种方法是反模式。

您需要在每个实体(医院、教堂、雇主、政府团体等)和联系人之间设置多对多关系表。

如果您希望更轻松地查询与联系人相关的所有实体,请考虑在多对多关系表之上创建一个视图。

于 2013-10-17T20:30:36.777 回答
1

I think the second option is better as it will allow you to maintain referential integrity of your database using the in-built SQL features (foreign keys), rather than relying on your code to maintain it.

于 2013-10-17T20:25:34.357 回答
0

This is the solution that you should be going towards:

type
----------------
typeId  name
1       hospital
2       church

contact
-----------------------------------------
contactId firstName LastName typeId (fk)
1         bob       is       1
2         your      uncle    2

If Bob can be a contact for more than one type, than you will need a junction table.

于 2013-10-17T20:25:38.947 回答