首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主键是两个不同的互斥表的外键

主键是两个不同的互斥表的外键
EN

Stack Overflow用户
提问于 2011-11-03 10:07:04
回答 1查看 1.2K关注 0票数 1

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

代码语言:javascript
复制
+----------------+            +-----------------+
|       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个实体。一方可以是个人或企业(但两者不能同时发生)。一个人可以有一个或多个银行账户,一个企业也可以有一个或多个银行账户。对于一个人来说,只有一个唯一的id才能被分配。对于一个企业来说,如果它有一个唯一的组合(方案代码,序列号和唯一ID ),那么它可以共享同一个唯一的ID'
  2. BUSINESS‘ID。
  3. 的主键是“唯一的ID”,
  4. 的主键是“唯一的ID”,
  5. 的主键是“唯一的ID”,“方案代码”,“方案代码”,而“Serial”
  6. 银行账户的主密钥是将个人和企业的所有密钥与“唯一的ID”作为唯一通用外键的组合,而“Scheme Code”/“Serial”是一个仅限于业务的外键。

我以为问题就在银行账户里。如果当事人是企业,则不会出现问题,因为所有主/外键都已填充(唯一ID、方案代码、序列号)。但是,如果一方是PERSON,则只会填充唯一ID,另外两个键将具有空值。我认为空主键是不允许的。

EN

回答 1

Stack Overflow用户

发布于 2011-11-03 11:34:29

让BANK_ACCOUNT指的是一方,而不是企业或个人,只要你保证一方与企业/个人的比例为1:1。

代码语言:javascript
复制
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通过联接查找这些值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7993078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档