Sql-Server
SQL Server 中的關係規範化
我想知道我應該從桌子上移開
PersonTypeId
還是Persons
把它放在那裡是個好主意?
您需要它,以便您知道 PersonType 是 Person 是什麼。沒有它,你不知道。
規範化意味著你沒有
PersonTypeName
在Persons
表中。但是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?)允許
SELECT
CHECK 約束。這樣就不必在子表中添加屬性。但大多數 DBMS 不允許這樣做,所以像上面那樣做是很常見的。