【问题标题】:One or Two primary keys for a database数据库的一个或两个主键
【发布时间】:2012-02-10 00:54:21
【问题描述】:

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

【问题讨论】:

  • 您的意思是“TABLE”而不是“DATABASE”吗?数据库没有主键,表有。

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


【解决方案1】:

que 是否通过两个键进行查询?或者当时一个?

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

但基本上都取决于您的应用架构/以及您选择使用的数据库架构...

【讨论】:

    【解决方案2】:

    在 MySql 中,主键获取聚集索引,因此您应该使主键成为您最常查询的唯一标识符。 (这包括连接。)

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

    【讨论】:

      【解决方案3】:

      您只能有一个作为主键。您可以让另一个成为唯一键。

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

      有些事情你需要问自己:

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

      回答这些修辞问题将帮助您确定一个表是否具有以下一项作为主键

      • vendor_identifier
      • product_identifier
      • vendor_identifier,product_identifier

      【讨论】:

        【解决方案4】:

        考虑以下几点:

        (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?
        

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

        【讨论】:

        • 如果 vendor_id 保证是唯一的——并且 OP 说它是唯一的——那么你将它与之结合的任何东西也将是唯一的。复合键不是由预期的搜索模式决定的;它们由功能依赖等决定。
        • @Catcall 如果您在 vendor_product 表中将 vendor_id 与相同的 product_id 组合两次(反之亦然),它不会是唯一的。我认为这就是马里奥所指出的。此外,使用搜索条件是确定功能依赖性的一种实用方法。
        • 如果您可以将 vendor_id 与相同的 product_id 组合两次,则 vendor_id 在该表中不是唯一的。
        • @Catcall。你当然是对的。但是,OP 描述令人困惑,并不意味着情况确实如此。因此我想澄清一下。至于复合键:我不同意你的数据密集型应用程序。
        【解决方案5】:

        因为你没有描述你的桌子 - 我建议你在这里实际上有 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 对强制执行唯一性,也可以不选择强制执行唯一性。如果是唯一的,它们可能会充当该表中的 COMPOUND KEY。如果您需要从架构中的其他位置引用 VENDOR_PRODUCT 中的行,那么您可以考虑使用新的单值主键,而不是将这两列复制到新表中并尝试使 FK 定义正确。

        【讨论】:

          【解决方案6】:

          假设您的 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 的组合具有唯一索引可确保您不会获得该数据组合的重复条目(但必须是 唯一 索引,而不仅仅是索引)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-08
            • 2012-06-29
            • 2018-07-19
            • 1970-01-01
            • 2010-09-07
            • 1970-01-01
            • 2012-12-29
            • 1970-01-01
            相关资源
            最近更新 更多