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 中尝试这个,但我们支持许多数据库。
听起来您有一个“One True Lookup Table ”(OTLT)反模式,并且您正在该表中混合实体。您已经找到了为什么这不是一个好主意的原因:
您上面的示例代码令人困惑(您在同一 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)
或者使用触发器来维护正确的代码。我也不会这样做。
归档时间: |
|
查看次数: |
2580 次 |
最近记录: |