gpt4 book ai didi

mysql - 我可以在一张表的复合主键中有太多列吗

转载 作者:行者123 更新时间:2023-12-01 00:19:05 24 4
gpt4 key购买 nike

我有一个使用 2 个外键字段和一个日期字段的表。一张表使用 3 个或更多字段作为主键是否常见?这样做有什么缺点吗?

--

我的 3 个表是 employees、training 和 emp_training。 employees 表保存员工数据。培训 table 举办不同的培训类(class)。我将 emp_training 表设计为字段 EmployeeID (FK)、TrainingID (FK)、OnDate。

一个员工可以参加多个培训类(class),也可以多次参加同一培训类(class)。但他们不能在同一天多次参加同一培训类(class)。哪个更好实现:

选项 A - 将所有 3 个字段设为主键

选项 B - 添加一个自动编号 PK 字段,并使用查询查找任何可能的重复项。

在使用 2 个字段作为主键之前我已经创建了很多表,但从来没有创建过 3 个,所以我很好奇继续选项 A 是否有任何缺点

最佳答案

值得一提的是,对于 SQL Server,默认情况下 PK 是唯一且唯一的集群 key ,但您也可以创建非集群 PK。

您可以定义一个新的聚集索引这不是主键。 “主键”其实只是一个名字...

最重要的问题是:哪些列参与了聚簇键以及(这是最重要的问题):它们是否有隐式排序?并且(也很重要):是否有很多更新操作会更改参与列的内容?

您必须知道,簇键定义了硬盘上的物理顺序。换句话说:聚集键就是表本身。您可以考虑包含所有列的索引。如果您的前导列(最坏情况)是一个 GUID,则每次插入您的表格都将不按顺序。这会导致 99.99% 的碎片化。

如果聚集索引绑定(bind)到插入时间或运行数(最佳情况),它永远不会进入碎片!

更糟糕的是:如果存在聚簇键(无论是否称为 PK),它将用作其他索引的查找键。

因此:在许多情况下,最好使用运行编号作为聚簇键和非聚簇多列索引,这样重建起来比聚簇索引要快得多。

所有指数都将从中获利!

我给你的建议:

  • 选项 C:一个运行编号作为 PK,另外还有一个唯一的多列 key 以确保数据完整性。不需要在这里使用自己的逻辑...

关于mysql - 我可以在一张表的复合主键中有太多列吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38400017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com