数据库的一个或两个主键

时间:2012-01-13 20:49:04

标签: mysql sql database database-design primary-key

我在表格中有两列始终是唯一的,vendor_identifierproduct_identifier。两者的长度差不多。我应该将它们都添加为主键,还是只添加一个或某些变体?在这里添加一个或两个之间有什么区别吗?

6 个答案:

答案 0 :(得分:1)

是两个键查询?或者当时可能有一个?

根据答案,您可以执行复合索引或两个不同的索引..如果要添加两个不同的索引,请记住最常用的索引应该是at the left

但基本上全部取决于您的应用程序的体系结构/以及您选择使用的数据库架构......

答案 1 :(得分:1)

在MySql中,主键获取聚簇索引,因此您应该将主键设置为最常查询的唯一标识符。 (这包括加入。)

从您的问题中不清楚这两个字段是否各自独一无二,或者它们是否仅保证作为组合是唯一的。如果它们应该始终是唯一的,那么至少应该在每个上面放置一个单独的唯一索引。如果它们只是组合中的唯一,那么这是你唯一的唯一保证,主键应该是它们中的两个作为单个键。

答案 2 :(得分:0)

您只能拥有一个主键。你可以让另一个成为一个独特的钥匙。

Whichever you prefer to be the default PRIMARY KEY is your choice

您需要问自己:

  • 包含两列的表格是否允许多个产品?
  • 具有两列的表是否允许多个供应商?
  • 具有两列的表是否允许元组(供应商,产品)一次或多次?

回答这些修辞问题将有助于您确定某张表是否具有以下其中一项作为主要关键

  • vendor_identifier
  • product_identifier
  • vendor_identifier,product_identifier

答案 3 :(得分:0)

请考虑以下事项:

(1) is the combination of vendor_id and product_id also guaranteed to be unique?
(2) will you always search with both vendor_id and product_id?

如果您对两者都回答“是”,那么复合主键才有意义。如果你不能,那么只需选择具有较高基数的那个作为主键,并在另一个上创建一个二级索引。

答案 4 :(得分:0)

因为你没有描述你的表 - 我建议你实际上有3个表:

VENDOR
--------
vendor_id
other_cols

PRODUCT
---------
product_id
other_cols

VENDOR_PRODUCT
--------------
vendor_id
product_id
price-description-dates etc.

在这种情况下 - VENDOR表中的VENDOR_ID是PK。 PRODUCT表中的PRODUCT_ID是PK(对于该表)

VENDOR_PRODUCT表中的VENDOR_ID是外键 VENDOR_PRODUCT表中的PRODUCT_ID是外键

您可以选择在VENDOR_PRODUCT表中的VENDOR_ID,PRODUCT_ID对上强制执行唯一性,或者不选择。如果是唯一的,它们可能在该表中充当复合键。如果需要从架构中的其他位置引用VENDOR_PRODUCT中的行,则可以考虑使用新的单值主键,而不是将这两列复制到新表中,并尝试使FK定义正确。

答案 5 :(得分:0)

假设您的vendor_identifier是与供应商表相关的外键,而product_identifier是与产品表相关的外键,我会创建一个自动编号字段(vendor_product_identifier,也许?)作为表的主键。其中包含vendor_id和product_id。然后我会在vendor_id和product_id的组合上放置一个唯一的索引。

所以,一般的想法是:

Vendor
------
vendor_identifier PK
name
phone
etc...

Product
-------
product_identifier PK
name
category
etc...

Vendor_Product
--------------
vendor_product_identifier //"AUTONUMBER PK"
vendor_identifier //"FK to Vendor, and part of COMBOINDEX1"
product_identifier //"FK to Vendor, and part of COMBOINDEX1"
etc...

拥有vendor_product的新密钥只需一个密钥即可在应用程序端传递,以引用供应商和产品的组合。在vendor_product表中对vendor_id和product_id的组合具有唯一索引可确保您不会获得该数据组合的重复条目(必须是唯一索引,而不仅仅是索引)。