Mysql

SQL:實體屬於(多對一)兩個不同實體之一

  • October 13, 2021

假設我organizationperson他們有one-to-many關係post

post只能由組織或使用者(個人)擁有。

我現在正在做的是使外鍵可以為空並添加 acheck constraint以確保只有一個organization_idperson_id具有值,而另一個是null.

這是否被認為是有效的SQL設計(最佳實踐)?如果我有兩個以上的實體可以成為某個文章的所有者怎麼辦?

在此處輸入圖像描述

您需要使用子類型1。大多數情況下,您的情況由Party表格處理:

CREATE TABLE PartyType
(
 PartyTypeCd  CHAR(1)      NOT NULL /* P - Person, O - Organization */
,Name         VARCHAR(50)  NOT NULL
,CONSTRAINT PK_PartyType PRIMARY KEY (PartyTypeCd)
,CONSTRAINT AK_PartyType UNIQUE (Name)
)

CREATE TABLE Party
(
 PartyId      INT          NOT NULL
,PartyTypeCd  CHAR(1)      NOT NULL
,Name         VARCHAR(45)  NOT NULL
,CONSTRAINT FK_Party_Discriminated_By_PartyType FOREIGN KEY (PartyTypeCd) REFERENCES PartyType (PartyTypeCd)
,CONSTRAINT PK_Party PRIMARY KEY (PartyId)
)

CREATE TABLE Person
(
 PersonId  INT          NOT NULL
,Bio       VARCHAR(45)  NOT NULL
,CONSTRAINT FK_Person_Is_Party FOREIGN KEY (PersonId) REFERENCES Party (PartyId)
,CONSTRAINT PK_Person PRIMARY KEY (PersonId)
)

CREATE TABLE Organization
(
 OrganizationId  INT  NOT NULL
 /* Other organization-only properties */
,CONSTRAINT FK_Organization_Is_Party FOREIGN KEY (OrganizationId) REFERENCES Party (PartyId)
,CONSTRAINT PK_Organization PRIMARY KEY (OrganizationId)
)

CREATE TABLE Post
(
 PostId   INT            NOT NULL
,PartyId  INT            NOT NULL
,Body     VARCHAR(1000)  NOT NULL
,CONSTRAINT FK_Post_Created_By_Party FOREIGN KEY (PartyId) REFERENCES Party (PartyId)
,CONSTRAINT PK_Post PRIMARY KEY (PostId)
) 

您需要確保PartyTypeCd在插入適當的子類型表時匹配。在 MySQL 中,這必須通過觸發器來完成。


1您可以參考這些 SO 文章以更深入地處理該主題:

  1. https://stackoverflow.com/questions/4763141/data-modeling-supertype-subtype
  2. https://stackoverflow.com/questions/4896831/how-to-implement-referential-integrity-in-subtypes

引用自:https://dba.stackexchange.com/questions/300888