【发布时间】:2013-08-19 15:00:06
【问题描述】:
我有表 A 和 B,它们无法编辑,并且都使用复合主键(region_id、数字)。
我有 N 个表,所谓的 Information,每个都有自己的 ID 作为主键。
A(或 B) 信息表是 M:N 关系,我需要这样的表。
所以我用这些列设计了一个表CtoInfo(其中C是A或B)
CREATE TABLE CtoInfo (
region_id ..
c_number ..
c_type // either A or B
info_id
info_type
.. //some other columns
)
前 3 列标识 A 或 B,其他 2 列标识信息。 (type表示哪个表和id是PK)
现在我想在这张表上创建一个主键。但看起来我需要在 PK 约束中包含 5 列!?
【问题讨论】:
-
5 列作为 PK 不是问题。您的问题将是声明 FK。您不能在单个关系 (FK) 中混合表。您可以有多个关系指向不同的 FK。但在 FK 一张桌子内。您需要 A、B 和其他表引用的 AB 主数据。使用适当的 3nf 可以确定您不应该有跨表的键。没有表的列数据类型。
-
如果我理解正确,我不应该制作一个通用的 M:N 表,其中 M 来自 2 个不同的表?我宁愿有 2 M:N 个表?
-
我想你可以用两个 M:N 表来做到这一点,但我认为你在声明 FK 时仍然存在问题。如果表 Z 只需要与 M:N 之一的关系就可以了。如果表 V 具有混合关系,那么您所能做的就是声明两个 FK,在这种情况下,两个 FK 都被强制执行。
-
那么如何使用触发器而不是外键约束呢?我知道这将是性能损失
-
您尝试过触发器吗?您希望如何在触发器中动态连接到不同的表?你试过什么?
标签: sql-server tsql composite-primary-key