-1

我有无法编辑的表 A 和 B,并且都使用复合主键(region_id,数字)。

我有 N 个表,即信息,每个表都有自己的 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 表示哪个 table 和 id 是 PK)

现在我想在这张桌子上做一个主键。但看起来我需要在 PK 约束中包含 5 列!?

4

1 回答 1

1

SQL Server 最多允许在一个约束中包含 16 列。所以五列不是问题。

使用自然键时,您经常会遇到多列主键约束。以 5 或 6 列作为键的“链接”表在这种设计中并不少见。

现在,您的设计存在一些问题。通常,出于性能原因,您希望使主键尽可能短。从性能的角度来看,单个整数代理键通常是更好的选择。

您还定义了无法强制执行的外键关系。这通常表明数据库模式存在问题。您正在链接到同一列中的 2 个不同实体。这意味着它们代表非常相似的东西,并且可能应该存在于同一张表中。然后,您可以提供其他表格,其中包含特定于其中一个但不是另一个的信息。sys.objects、sys.tables 和 sys.procedures 为您提供了如何工作的示例。(在这种情况下,sys.tables 和 sys.procedures 是还包括 sys.objects 形式的列的视图。在您的情况下,您不需要重复该信息。)

于 2013-08-19T15:53:28.480 回答