Sql server TSQL主键覆盖的列太多?

Sql server TSQL主键覆盖的列太多?,sql-server,tsql,composite-primary-key,Sql Server,Tsql,Composite Primary Key,我有不能编辑的表A和表B,它们都使用复合主键(region_id,number) 我有N个表,即所谓的信息,每个表都有自己的ID作为主键 A(或B)Info表是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,它们都使用复合主键(region_id,number)

我有N个表,即所谓的信息,每个表都有自己的ID作为主键

A(或B)Info表是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列标识信息。(类型表示主键是哪个表和id)


现在我想在这个表上创建一个主键。但看起来我需要在PK约束中包含5列

SQL Server允许在约束中最多包含16列。因此,五列不是问题

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

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


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

5列作为主键不是问题。你的问题是申报FK。不能在单个关系(FK)中混合使用表。可以有多个关系指向不同的FK。但是在FK一张桌子里。您需要A、B和其他表引用的AB主数据。使用适当的3nf,您不应该有跨越表的键。表中没有列数据类型。如果我理解正确,我不应该创建一个通用的M:N表,其中M来自两个不同的表?我更希望有两个M:N表?我想你可以用两个M:N表来实现这一点,但我认为你在声明FK时仍然有问题。如果表Z只需要与M:N中的一个的关系,则可以。如果表V具有混合关系,那么您所能做的就是声明两个FK,在这种情况下,两个FK都是强制的。那么使用触发器而不是外键约束怎么样?我知道这将是一个性能损失你能试试扳机吗?如何期望在触发器中动态连接到不同的表?你试过什么?好的,信息表也有同样的问题吗?我正在根据M:N表中的Info_类型引用N个Info表(每个表都有另一组列),如何代替insert/update触发器?代替外键约束。我无法将这两个表合并在一个表中,我有大约10个信息表。我不希望A2I1、A2I2等与B2I1、B2I2一起作为单独的表。在当前的设计中,您不能使用声明性外键。这表明数据库布局中存在问题。有很多方法可以“处理”这个问题,就像你提到的触发方法一样,但所有这些都只是症状上的绷带,无法解决根本问题。我能给你的唯一建议就是修改设计然而,您最初的问题是关于主要关键约束的,我相信我已经回答了。如果你需要更多的信息,请告诉我。