固定值字段的外键约束

Dav*_*ght 5 foreign-key sybase odbc

注意:我是开发人员...

我有一个资产表,其中包含许多代码,这些代码是进入第二个表 OutlineFiles 的外键。OutlineFiles 表将类型和代码作为主键。外键约束需要看起来像这样......

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" );
Run Code Online (Sandbox Code Playgroud)

因此,将通过“LN”和“CC”的固定值与轮廓表建立关系。或者将数据库更改为有两个表并删除 OutlineFiles 表上的 Type 列会更容易吗?我正在 Sybase 中尝试这个,但我们支持许多数据库。

gbn*_*gbn 7

听起来您有一个“One True Lookup Table ”(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")
   ...)
Run Code Online (Sandbox Code Playgroud)

如果您有 30 个代码要查找,您将有 30 个查找表:这是正确的。

如果您坚持使用 OTLT,则必须添加额外的列来存储资产中的类型并将它们 FK 到您的 OTLT。我不会这样做。

    ...
    CostCentreType char(2) NOT NULL,
    CostCentreCode ... NOT NULL,
    LocationType  char(2) NOT NULL,
    LocationCode ... NOT NULL,
    ...
Run Code Online (Sandbox Code Playgroud)

或者使用触发器来维护正确的代码。我也不会这样做。