在唯一的列组合上制作PK或添加数字rowID

时间:2012-01-19 06:12:52

标签: mysql sql

这更像是一个设计问题,而不是编程问题。

我有一张表格,用于存储零售产品的详细信息:

Name    Barcode    BarcodeFormat  etc...
---------------------------------------- 

(Name, Barcode, BarcodeFormat)是三列将唯一标识表中的记录(候选键)。但是,我有其他表需要一个FK。所以我介绍了一个auto_incrementitemId并将其作为PK。

我的问题是 - 我应该PK作为(itemId, Name, Barcode, BarcodeFormat)还是最好有PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat)

我主要关注的是INSERTSELECT操作方面的表现,但也欢迎对尺寸发表评论。

我正在使用innodbmysql

4 个答案:

答案 0 :(得分:5)

绝对:PK(itemId)和UNIQUE(名称,条形码,条形码格式)。

  • 您不希望为所有联接使用多部分密钥等麻烦
  • 您可能有一天会有行没有条形码值,这些行不会是唯一的,所以您不希望将唯一性硬连接到您的模型中(您可以轻松地删除唯一性而不会破坏任何关系等)
  • 对唯一性的约束是业务级问题,而不是数据库实体问题:您将始终需要密钥,但您可能并不总是需要唯一性的业务规则

答案 1 :(得分:2)

除非您拥有数百万种产品或非常高的吞吐量要求,否则在性能方面不会有太大差异。

我的首选是拥有代理PK(即自动增量列,PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat)的第二个选项),因为如果业务键发生变化,这将更容易管理。

答案 2 :(得分:2)

您有两个候选键。我们将三列复合键称为“自然键”,将auto_increment列称为“代理键”。两者都需要在数据库级别使用唯一约束(小写“唯一”以表示逻辑)。

可选地,一个候选键可以被指定为“主要”。选择哪个密钥(如果有的话)应该是这个名称是任意的。谨防有人在这件事上给你明确的建议!

答案 3 :(得分:0)

如果您已经添加了一个itemId,那么您应该将其用作PK,并使其他三列具有UNIQUE。

如果您没有itemId,那么您可以使用其他列作为PK,但可能难以将其保留在任何地方。在这种情况下它不是很好,因为产品应该有一个id,因为它是一个实体,但如果它只是一个关系,那么没有一个id列是可以接受的。