web-dev-qa-db-ja.com

固定値フィールドの外部キー制約

注:私は開発者です...

2番目のテーブルOutlineFilesへの外部キーである多くのコードを含むAssetテーブルがあります。 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」の固定値を介してアウトラインテーブルとの関係が存在します。または、データベースを2つのテーブルに変更し、OutlineFilesテーブルのType列を削除する方が簡単でしょうか。 Sybaseでこれを試みていますが、多くのデータベースをサポートしています。

5

"One True Lookup Table "(OTLT)アンチパターンがあり、このテーブルにエンティティを混在させているようです。あなたはそれが良い考えではない理由を見つけました:

  • フィルタリングされた外部キーは使用できません
  • 定数にFKできない
  • 複数の親を持つことはできません

上記のサンプルコードはわかりにくい(同じコード列に複数の親がある)ので、理解できることを説明します

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を主張する場合は、追加の列を追加してアセットにタイプを格納し、OTLTにFKする必要があります。私はこれをしません。

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

または、トリガーを使用して正しいコードを維持します。私もこれをしません。

7
gbn