Mysql
SQL:實體屬於(多對一)兩個不同實體之一
假設我
organization
和person
他們有one-to-many
關係post
。
post
只能由組織或使用者(個人)擁有。我現在正在做的是使外鍵可以為空並添加 a
check constraint
以確保只有一個organization_id
和person_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 文章以更深入地處理該主題: