【发布时间】:2011-11-03 10:07:04
【问题描述】:
我在如何设计必须具有主键的表时遇到问题,主键是两个互斥表的外键。
+----------------+ +-----------------+
| PARTY | + PERSON +
+----------------+ +-----------------+
| Unique ID (PK) | -|------O|-| Unique ID (FK) |
| Party Type | | some details |
| | +-----------------+
| |
| | +-----------------+
| | | BUSINESS |
| | +-----------------+
| | | Scheme Code (PK)|
| | -|------O|<| Serial No (PK) |
| | | Unique ID (FK) |
| | | some details |
+----------------+ +-----------------+
+-----------+ +-----------------+
| PERSON | -|-----------O|<| BANK ACCOUNT |
+-----------+ +-----------------+
| Account No (PK) |
+-----------+ | Unique ID (FK) |
| BUSINESS | -|-----------O|<| Scheme Code (FK)|
+-----------+ | Serial No (FK) |
| some details |
+-----------------+
有 4 个实体。 PARTY 可以是 PERSON 或 BUSINESS(但不能同时是两者)。一个人可以有一个或多个银行帐户,一个企业也可以有一个或多个银行帐户。
对于 PERSON,只能分配 1 个唯一 ID。
对于 BUSINESS,它可以共享相同的唯一 PARTY id,因为它具有(方案代码、序列号和唯一 ID)的唯一组合
PARTY 的主键是“唯一 ID”
PERSON 的主键是“唯一 ID”
BUSINESS 的主键是“唯一 ID”、“方案代码”和“序列号”
BANK ACCOUNT 的主键是 PERSON 和 BUSINESS 的所有键的组合,“唯一 ID”作为唯一的公共外键,“方案代码”/“序列号”是仅来自 BUSINESS 的外键.
我认为问题出在 BANK ACCOUNT 实体中。如果 PARTY 是 BUSINESS,则不会有任何问题,因为所有主键/外键都已填充(唯一 ID、方案代码、序列号)。但是,如果 PARTY 是 PERSON,则只会填充唯一 ID,而其他两个键将具有 NULL 值。而且我认为 NULL 主键是不允许的。
【问题讨论】:
标签: sql foreign-keys