Sql-Server

SQL Server 中的關係規範化

  • March 26, 2020

在此處輸入圖像描述

我想知道我應該從桌子上移開PersonTypeId還是Persons把它放在那裡是個好主意?

您需要它,以便您知道 PersonType 是 Person 是什麼。沒有它,你不知道。

規範化意味著你沒有PersonTypeNamePersons表中。但是PersonTypeID很好,你需要什麼。

除了Rob Farley的回答之外,保證PersonTypeId正確的一種常見模式是在 中引入一個超鍵PERSONS

ALTER TABLE Persons ADD CONSTRAINT ... 
   UNIQUE (PersonTypeId, Id);

ALTER TABLE Persons ADD CONSTRAINT ...   
   CHECK ( PersonTypeId in ('C','D','S'));

並使用 type 屬性擴展每個子類型。現在客戶可以引用這個超級密鑰:

CREATE TABLE Customers
( CustomerID ... NOT NULL -- is this needed?
, PersonId ... NOT NULL
, PersonTypeId CHAR(1) DEFAULT 'C' NOT NULL
, ...
,     CHECK ( PersonTypeId = 'C' )
,     FOREIGN KEY ( PersonTypeId, PersonId)
        REFERENCES Persons (PersonTypeId, Id)
);

幾個 DBMS(Sybase?)允許SELECTCHECK 約束。這樣就不必在子表中添加屬性。但大多數 DBMS 不允許這樣做,所以像上面那樣做是很常見的。

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