Foreign-Key

固定值欄位的外鍵約束

  • January 19, 2012

注意:我是開發人員…

我有一個資產表,其中有許多程式碼是第二個表 OutlineFiles 的外鍵。OutlineFiles 表將 Type 和 Code 作為主鍵。外鍵約束需要看起來像這樣……

ALTER TABLE "dbo"."Assets" 
ADD CONSTRAINT "Locations" FOREIGN KEY ( "LN", "LocationCode" ASC ) 
REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );

ALTER TABLE "dbo"."Assets" 
ADD CONSTRAINT "CostCentre" FOREIGN KEY ( "CC", "CostCentreCode" ASC ) 
REFERENCES "dbo"."OutlineFiles" ( "Type", "Code" );

因此,將通過“LN”和“CC”的固定值與輪廓表建立關係。或者將數據庫更改為有兩個表並刪除 OutlineFiles 表上的 Type 列會更容易嗎?我在 Sybase 中嘗試這樣做,但我們支持許多數據庫。

聽起來您有一個“一個真正的查找表”(OTLT)反模式,並且您在此表中混合實體。您已經找到了為什麼這不是一個好主意:

  • 不能有過濾的外鍵
  • 不能對常量進行 FK
  • 不能有多個父母

您上面的範常式式碼令人困惑(同一 Code 列有多個父級),所以我會告訴您我的理解

CREATE TABLE OutlineFilesCostCentre (
   CostCentreCode ...NOT NULL --PK
   ...
   )

CREATE TABLE OutlineFilesLocations (
   LocationCode ... NOT NULL --PK
   ...
   )

CREATE TABLE Assets (
   ...
   CostCentreCode ... NOT NULL,
   LocationCode ... NOT NULL,
   ...

   CONSTRAINT FK_Assets_CostCentre" FOREIGN KEY ("CostCentreCode")
               REFERENCES "dbo"."OutlineFilesCostCentre" ("CostCentreCode"),
   CONSTRAINT FK_Assets_Locations" FOREIGN KEY ("LocationCode")
               REFERENCES "dbo"."OutlineFilesLocations" ("LocationCode")
  ...)

如果您有 30 個要查找的程式碼,您將有 30 個查找表:這是正確的。

如果您堅持使用 OTLT,則必須添加額外的列以將類型儲存在 Assets 中並將它們 FK 到您的 OTLT。我不會這樣做的。

   ...
   CostCentreType char(2) NOT NULL,
   CostCentreCode ... NOT NULL,
   LocationType  char(2) NOT NULL,
   LocationCode ... NOT NULL,
   ...

或者使用觸發器來維護正確的程式碼。我也不會這樣做。

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