使用计算列作为主键的一部分是一个好主意吗?

Bra*_*ann 7 sql primary-key sql-server-2008

我有一个表定义为:

OrderID bigint NOT NULL,
IDA varchar(50) NULL,
IDB bigint NULL,
[ ... 50 other non relevant columns ...]
Run Code Online (Sandbox Code Playgroud)

此表的自然主键是(OrderID,IDA,IDB),但这不可能,因为IDA和IDB可以为null(它们都可以为null,但它们永远不会同时定义).现在我对这3列有一个独特的约束.

现在,问题是我需要一个主键来启用事务复制,我面临两个选择:

  • 创建标识列并将其用作主键
  • 创建一个包含IDA或IDB的非空计算列C,如果两列都为空,则创建'',并使用(OrderID,C)作为我的主键.

第二个替代接缝更清洁,因为我的PK是有意义的,并且是可行的(参见msdn链接),但由于我从未在任何地方看到这样做,我想知道它们是否对这种方法有所帮助.

小智 2

可以为 null 的列不符合作为 pk 的一部分的资格,因为 pk 也必须是唯一的。

此外,PK 永远不应该有意义,因为值的含义可能会改变。

表A和表B有关系吗?查看关系数据模型。设计上可能存在错误。

OrderID 应该是唯一的,因此足以进行 PK。