【问题标题】:Composite primary keys vs auto increment primary key in sql workbenchsql工作台中的复合主键与自动递增主键
【发布时间】:2021-07-04 03:32:24
【问题描述】:

我需要有迎宾经验的人的建议。

我的数据库中有一个关联实体,如下所示:

Table2-> CustomerID, ServiceID, DateSub

由于同一个客户(有 PK,例如 1111)可以多次但不能在同一日期要求相同的服务(有 PK,例如 3),因此表的复合 PK 2 不能只是 (CustomerID, ServiceID)。

现在我有两个选择:

1- "DateSub" 也是主键,所以表 2 的 PK 将是 (CustomerID, ServiceID, DateSub)

2- 为关联实体创建一个特定的 PK(例如,Table2ID,因此 CustomerID 和 Service ID 将为 FK)

您会采用这两种方法中的哪一种,为什么?谢谢

【问题讨论】:

  • 第二个选项总是更好!。因为日期不应该是主键。大量客户在同一天提供相同的服务。因此,您需要为您的表指定一个特定的 PK,例如上面提到的第二个选项 Table2_id 或只是 Id 并选中自动增量
  • 也许我会关注第一个
  • 主键是唯一键,因此您的第二个选项将只允许每个客户 1 个,而不管服务如何......您是否预计每个客户每天只有一个服务请求。
  • 我认为合成主键是最好的选择——如果需要的话。如果需要,(CustomerID, ServiceID, DateI) 表达式的唯一性可以通过额外的 UNIQUE 索引来控制(但我怀疑它是否有用)。
  • 附言。如果您仍然使用复合 PK,那么请仔细考虑索引表达式中最有用的列顺序(它必须改进对该表的大部分查询)。不要忘记 PK 是聚集索引。

标签: mysql sql database database-design mysql-workbench


【解决方案1】:

首先您需要确定是否需要将CustomerIDServiceIDDateI 列的组合设为唯一?如果是这样,那么您应该选择第一个选项。

否则我会选择第二个选项。

如果 DateI 是日期数据类型,则使用第一个选项,您将无法为客户插入相同的服务两次。如果是日期时间,那么它是可行的。

如果您想在任何其他表中使用此主键(复合主键)作为外键,那么您也需要使用那里的所有三列。

【讨论】:

  • 我现在添加一个澄清:同一个客户可以要求相同的服务,但在同一日期不能超过一次(服务持续一到三个月)
  • 是否有可能将此主键用作任何其他表中的外键?
  • 不,没有
  • 那么我想进入第一点。如果这些列中的唯一性不是必需的,那么我会选择第二个选项。
  • 您可以在下面的链接中阅读 Gordon Linoff 的答案。 stackoverflow.com/questions/50043071/….
【解决方案2】:

我倾向于选择“自然”的 PK。您有 3 列,它们一起可以唯一地定义每一行。我会考虑使用它。

下一个问题是 3 列的放置顺序。这取决于常见的查询。请提供。

索引(包括 PK)仅在最左边使用。可能需要一些辅助键,以便有效地访问其他列。再次,让我们看看查询。

如果您有很多二级索引,可能最好有一个代理,AUTO_INCREMENT“id”作为 PK。再次,让我们看看查询。

如果您曾经使用过日期范围,那么可能最好将DateSub 放在任何索引的最后。 (有极少数例外。)

表格有多少行?

表格是ENGINE=InnoDB,对吗?

提醒:PRIMARY KEY 是唯一键,即INDEX

DateSub 的数据类型为 DATE,对吗?

【讨论】:

    猜你喜欢
    • 2015-06-08
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2015-11-13
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多