2011-11-03 57 views
1

我在如何设计一个表,必须有一个主键是两个互斥表的外键的问题。主键是两个不同的互斥表的外键

+----------------+   +-----------------+ 
|  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 | 
           +-----------------+ 
  1. 有4个实体。一方可以是个人或企业(但不能在同一时间)。一个人可以拥有一个或多个银行账户,一个企业也可以拥有一个或多个银行账户。

  2. 对于一个人,只能分配一个唯一ID。

  3. 对于一个企业,它可以共享相同的唯一方ID给它具有(计划编号,序列号,和唯一ID)的独特组合

  4. 党的主键是唯一的ID“

  5. PERSON的主键是唯一的ID“

  6. 企业的主键是唯一的ID”, '方案代号' 和 '序列号'

  7. 银行帐户是p& rimary密钥是PERSON和BUSINESS的所有密钥的组合,唯一的公共外键是'唯一ID','Scheme Code'/'序列号'是仅限于BUSINESS的外部密钥。

我认为这个问题是在银行帐户实体。如果PARTY是商业用户,所有主/外密钥都被填充(唯一ID,方案代码,序列号),则不存在任何问题。但是,如果PARTY是PERSON,则只会填充唯一ID并且其他两个键将具有NULL值。我认为不允许使用NULL主键。

回答

0

只要您确保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通过连接查找这些值。

+0

嗨Simofuri,谢谢你的回答。我的问题是,当BANK_ACCOUNT for BUSINESS将共享相同的account_no,但使用不同的scheme_code和serial_no。 PARTY是与商业的一对多关系。只要与scheme_code和serial_no的组合是唯一的,那么BUSINESS就可以拥有相同的party_id。 –

+0

例如,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' ? –

相关问题