Sql 使用复合/复合主键的缺点是什么?
使用复合/复合主键的缺点是什么?需要更多的特殊性 如果做得太过分,它会使插入变得过于复杂(每个键都必须存在),文档和连接的读取可能会因为不完整而受到怀疑 有时,它可能表示有缺陷的数据模型(复合键真的是数据所描述的吗?)Sql 使用复合/复合主键的缺点是什么?,sql,database,Sql,Database,使用复合/复合主键的缺点是什么?需要更多的特殊性 如果做得太过分,它会使插入变得过于复杂(每个键都必须存在),文档和连接的读取可能会因为不完整而受到怀疑 有时,它可能表示有缺陷的数据模型(复合键真的是数据所描述的吗?) 我不相信会有性能代价……它很容易出错。在这种情况下,我建议使用生成的主键,对自然复合键具有唯一的NOTNULL约束 如果使用自然键作为主键,则很可能必须在外键引用中引用这两个值,以确保标识正确的记录 可能会给规范化带来更多问题(,“请注意,当1NF表没有复合候选键(候选键由多个属
我不相信会有性能代价……它很容易出错。在这种情况下,我建议使用生成的主键,对自然复合键具有唯一的NOTNULL约束 如果使用自然键作为主键,则很可能必须在外键引用中引用这两个值,以确保标识正确的记录
复合键本身并没有错,但主键在理想情况下应该尽可能小(就所需字节数而言)。如果主键很长,则会导致非聚集索引膨胀
请记住,主键中列的顺序很重要。第一列应尽可能具有选择性,即尽可能“独特”。第一列上的搜索可以进行搜索,但第二列上的搜索必须进行扫描,除非第二列上还有非聚集索引。我认为这是合成键争论的一个专门化(是使用有意义的键还是任意合成主键)。出于一些原因,我几乎完全站在这场辩论的关键方面。以下是一些更相关的问题:
- 你必须抚养孩子 外键末尾的表 最新的如果你改变主意 主键之一的值 字段(可能发生的情况-请参阅 (下图)你必须以某种方式改变 所有依赖表,其中 它们的PK值包括 领域。这有点棘手 因为更改键值将 使用使FK关系无效 子表,以便您可以(视情况而定 关于约束验证选项 在您的平台上可用)必须 采取复制文件之类的伎俩 记录到新记录并删除 旧唱片
- 在深层模式中,键可以 相当宽-我看到了8列 一次
- 主键值的更改可以是 在ETL中很难识别 进程从系统中加载。 我曾经有机会举的例子 这是一个MIS应用程序 从保险中提取 核保系统。在一些 在某些情况下,保单条目将 客户重复使用,更改 策略标识符。这是一个 的主键的一部分 桌子当这种情况发生时 仓库装载不知道是什么 旧值无效,因此无法匹配 新的数据将被添加到它。开发商 必须通过审计进行搜索 记录以标识更改的值
非合成主键的大多数问题都与记录的PK值更改有关。非合成值最有用的应用程序是打算使用数据库模式的应用程序,例如M.I.S.应用程序,其中报表编写器直接使用表。在这种情况下,带有固定域(如货币代码或日期)的短值可以合理地直接放在表上以方便使用。使用复合主键的主要缺点是,您会混淆典型的ORM代码生成器。以具有两个候选键的表为例:一个简单主键(单列)和一个复合键(多列)。在这种情况下,您的问题似乎是,“如果我选择将一个键提升为‘主’键,而选择复合键,我会遇到什么不利条件?” 首先,考虑一下你是否真的需要推广一把钥匙:"SQL中
主键
的存在本身似乎是某种历史上的偶然。根据作者Chris Date的说法,SQL的最早版本没有任何键约束,主键
只是后来才添加到SQL标准中。标准的设计者显然是从E.F.Codd那里得到这个术语的尽管当时Codd最初的想法已经被抛弃,但他还是放弃了它!(Codd最初提出外键只能引用一个键——主键——但这个想法被遗忘和忽略了,因为它被广泛认为是一个毫无意义的限制)。“[来源:
其次,您将应用什么标准来选择表中的哪个键应该是“主”键?
在SQL中,键主键的选择是任意的,并且是特定于产品的