sql工作台中的复合主键与自动递增主键
Posted
技术标签:
【中文标题】sql工作台中的复合主键与自动递增主键【英文标题】:Composite primary keys vs auto increment primary key in sql workbench 【发布时间】: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 是聚集索引。
【参考方案1】:
首先您需要确定是否需要将CustomerID
、ServiceID
和DateI
列的组合设为唯一?如果是这样,那么您应该选择第一个选项。
否则我会选择第二个选项。
如果 DateI 是日期数据类型,则使用第一个选项,您将无法为客户插入相同的服务两次。如果是日期时间,那么它是可行的。
如果您想在任何其他表中使用此主键(复合主键)作为外键,那么您也需要使用那里的所有三列。
【讨论】:
我现在添加一个澄清:同一个客户可以要求相同的服务,但在同一日期不能超过一次(服务持续一到三个月) 是否有可能将此主键用作任何其他表中的外键? 不,没有 那么我想进入第一点。如果这些列中的唯一性不是必需的,那么我会选择第二个选项。 您可以在下面的链接中阅读 Gordon Linoff 的答案。 ***.com/questions/50043071/….【参考方案2】:我倾向于选择“自然”的 PK。您有 3 列,它们一起可以唯一地定义每一行。我会考虑使用它。
下一个问题是 3 列的放置顺序。这取决于常见的查询。请提供。
索引(包括 PK)仅在最左边使用。可能需要一些辅助键,以便有效地访问其他列。再次,让我们看看查询。
如果您有很多二级索引,可能最好有一个代理,AUTO_INCREMENT
“id”作为 PK。再次,让我们看看查询。
如果您曾经使用过日期范围,那么可能最好将DateSub
放在任何索引的最后。 (有极少数例外。)
表格有多少行?
表格是ENGINE=InnoDB
,对吗?
提醒:PRIMARY KEY
是唯一键,即INDEX
。
DateSub
的数据类型为 DATE
,对吗?
【讨论】:
以上是关于sql工作台中的复合主键与自动递增主键的主要内容,如果未能解决你的问题,请参考以下文章