主键是两个不同的互斥表的外键
我在如何设计一个表,必须有一个主键是两个互斥表的外键的问题。主键是两个不同的互斥表的外键
+----------------+ +-----------------+
| 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个实体。一方可以是个人或企业(但不能在同一时间)。一个人可以拥有一个或多个银行账户,一个企业也可以拥有一个或多个银行账户。
对于一个人,只能分配一个唯一ID。
对于一个企业,它可以共享相同的唯一方ID给它具有(计划编号,序列号,和唯一ID)的独特组合
党的主键是唯一的ID“
PERSON的主键是唯一的ID“
企业的主键是唯一的ID”, '方案代号' 和 '序列号'
银行帐户是p& rimary密钥是PERSON和BUSINESS的所有密钥的组合,唯一的公共外键是'唯一ID','Scheme Code'/'序列号'是仅限于BUSINESS的外部密钥。
我认为这个问题是在银行帐户实体。如果PARTY是商业用户,所有主/外密钥都被填充(唯一ID,方案代码,序列号),则不存在任何问题。但是,如果PARTY是PERSON,则只会填充唯一ID并且其他两个键将具有NULL值。我认为不允许使用NULL主键。
只要您确保PARTY与BUSINESS/PERSON是1:1,使BANK_ACCOUNT参考PARTY而不是BUSINESS或PERSON即可。
CREATE TABLE PARTY (
party_id INT PRIMARY KEY)
CREATE TABLE PERSON (
person_id INT PRIMARY KEY,
party_id INT FOREIGN KEY REFERENCES PARTY(party_id),
...,)
CREATE TABLE BUSINESS (
business_id INT PRIMARY KEY,
party_id INT FOREIGN KEY REFERENCES PARTY(party_id),
scheme_code <TYPE>,
serial_no <TYPE>,
...,)
CREATE TABLE BANK_ACCOUNT (
account_no INT PRIMARY KEY,
party_id INT FOREIGN KEY REFERENCES PARTY(party_id)
...,)
要实施业务规则#1,其中一方可以是企业或个人,但不能两者都:你需要在企业或个人的PARTY.party_id检查触发/程序来实现。
对于规则2,PARTY与PERSON严格为1:1,在(PERSON.person_id,PERSON.party_id)上创建复合/多列主键或唯一索引。 see here
对于规则#3,与规则#2相同的解决方案。如果您可以在(BUSINESS.party_id,BUSINESS.scheme_code,BUSINESS.serial_no)上拥有复合主键,则可以省略BUSINESS.business_id。
如果你能做到上述所有的规则,规则#7就变得无关紧要。您不需要在BANK_ACCOUNT中为scheme_code/serial_no设置列。只需创建一个视图并使用PARTY.party_id通过连接查找这些值。
嗨Simofuri,谢谢你的回答。我的问题是,当BANK_ACCOUNT for BUSINESS将共享相同的account_no,但使用不同的scheme_code和serial_no。 PARTY是与商业的一对多关系。只要与scheme_code和serial_no的组合是唯一的,那么BUSINESS就可以拥有相同的party_id。 –
例如,scheme_code'1'下的BUSINESS'A'将与scheme_code'2'下的BUSINESS'A'共享相同的account_no'abc',但scheme_code'3'下的BUSINESS'A'将拥有不同的account_no'efg'。如果我们仅将BANK_ACCOUNT中的party_id作为FOREIGN KEY引用PARTY,那么我们如何确定BUSINESS_A'对于scheme_code'1'/'2'具有account_no'abc'并且对于scheme_code'3'具有account_no'def' ? –