注:私は開発者です...
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でこれを試みていますが、多くのデータベースをサポートしています。
"One True Lookup Table "(OTLT)アンチパターンがあり、このテーブルにエンティティを混在させているようです。あなたはそれが良い考えではない理由を見つけました:
上記のサンプルコードはわかりにくい(同じコード列に複数の親がある)ので、理解できることを説明します
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,
...
または、トリガーを使用して正しいコードを維持します。私もこれをしません。