这更像是一个设计问题,而不是编程问题。
我有一张表格,用于存储零售产品的详细信息:
Name Barcode BarcodeFormat etc...
----------------------------------------
(Name, Barcode, BarcodeFormat)
是三列将唯一标识表中的记录(候选键)。但是,我有其他表需要一个FK。所以我介绍了一个auto_increment
列itemId
并将其作为PK。
我的问题是 - 我应该PK
作为(itemId, Name, Barcode, BarcodeFormat)
还是最好有PK(itemId)
和UNIQUE(Name, Barcode, BarcodeFormat)
。
我主要关注的是INSERT
和SELECT
操作方面的表现,但也欢迎对尺寸发表评论。
我正在使用innodb
表mysql
答案 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列是可以接受的。