【问题标题】:TSQL Primary key over too many columns?TSQL主键过多的列?
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,信息表也有同样的问题?我正在根据 M:N 表中的 info_type 引用 N 个 Info 表(每个表都有另一组列)
  • 如何代替插入/更新触发器?代替外键约束。我无法将这 2 个表合二为一,我有大约 10 个信息表。我不想将 A2I1、A2I2 等与 B2I1、B2I2 一起作为单独的表格
  • 对于您当前的设计,您不能使用声明性外键。这表明数据库布局存在问题。有很多方法可以“处理”这个问题,比如你提到的触发方法,但所有这些都只是对症状的绷带,并不能解决根本问题。我能给你的唯一建议是修复设计。 - 但是,您最初的问题是关于主键约束的,我相信我已经回答了。如果您需要更多相关信息,请告诉我。
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 2011-04-10
  • 2014-06-11
  • 2010-10-18
  • 2014-06-25
  • 1970-01-01
相关资源
最近更新 更多