我在如何设计一个必须有主键的表上有一个问题,它是两个互斥表的外键。
+----------------+ +-----------------+
| 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 |
+-----------------+我以为问题就在银行账户里。如果当事人是企业,则不会出现问题,因为所有主/外键都已填充(唯一ID、方案代码、序列号)。但是,如果一方是PERSON,则只会填充唯一ID,另外两个键将具有空值。我认为空主键是不允许的。
发布于 2011-11-03 11:34:29
让BANK_ACCOUNT指的是一方,而不是企业或个人,只要你保证一方与企业/个人的比例为1:1。
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,对于一方严格为1:1的PERSON,请创建一个复合/多列主键on (PERSON.person_id,PERSON.party_id)或唯一索引。see here
对于规则#3,与规则#2相同的解决方案。如果您可以有一个复合主键(BUSINESS.party_id、BUSINESS.scheme_code、BUSINESS.serial_no),则可以省略BUSINESS.party_id。
如果你能做到以上所有的事情,那么第7条就变得无关紧要了。对于will _code/serial_no,您不需要在BANK_ACCOUNT中有列。只需创建一个视图,并使用PARTY.party_id通过联接查找这些值。
https://stackoverflow.com/questions/7993078
复制相似问题