【发布时间】:2014-11-22 14:02:16
【问题描述】:
虽然可以使用复合主键,但对于下面的情况,这真的是一种不好的做法吗? Stackoveflow 上的共识在这个问题上似乎是双向的。
为什么?
我想将订单的付款存储在单独的表中。原因是,一个订单可以有许多项目,这些项目以多对多关系的形式在单独的表中处理。现在,如果我的付款表不使用复合主键,我将失去唯一的PaymentID:
[PaymentId] INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[OrderId] INT NOT NULL PRIMARY KEY --Also a Foreign Key--
现在,如果我只删除 OrderId 的主键,我将在这里失去我的一对一关系,所以 Many OrderIds can be associated to many PaymentIds,我不想要这个。
这似乎就是为什么其他关于 SO 的答案(大部分)得出的结论是复合键是一个坏主意。如果不好,那么最佳做法是什么?
【问题讨论】:
-
如果我理解正确的话,在这种情况下,您可以在
OrderId上添加一个单独的唯一约束,并将PaymentId作为主键。 -
我没看懂:“原因是,一个订单可以有很多项目,这些项目也可以在一个单独的表中以多对多关系的形式处理。”?如果您在
payments表中有order_id,那么您所要做的就是用orders表引用它,您将如何失去唯一的PaymentID? -
@Laurence:是的,但是在这种情况下,1 个订单可以有多次付款,这很糟糕,对吗?
-
在我看来,为一个订单多次付款一点也不差。
-
@Surya:请看我之前的评论
标签: sql database database-design relational-database