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 次 |
| 最近记录: |