Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用复合/复合主键的缺点是什么?_Sql_Database - Fatal编程技术网

Sql 使用复合/复合主键的缺点是什么?

Sql 使用复合/复合主键的缺点是什么?,sql,database,Sql,Database,使用复合/复合主键的缺点是什么?需要更多的特殊性 如果做得太过分,它会使插入变得过于复杂(每个键都必须存在),文档和连接的读取可能会因为不完整而受到怀疑 有时,它可能表示有缺陷的数据模型(复合键真的是数据所描述的吗?) 我不相信会有性能代价……它很容易出错。在这种情况下,我建议使用生成的主键,对自然复合键具有唯一的NOTNULL约束 如果使用自然键作为主键,则很可能必须在外键引用中引用这两个值,以确保标识正确的记录 可能会给规范化带来更多问题(,“请注意,当1NF表没有复合候选键(候选键由多个属

使用复合/复合主键的缺点是什么?

需要更多的特殊性

如果做得太过分,它会使插入变得过于复杂(每个键都必须存在),文档和连接的读取可能会因为不完整而受到怀疑

有时,它可能表示有缺陷的数据模型(复合键真的是数据所描述的吗?)


我不相信会有性能代价……它很容易出错。

在这种情况下,我建议使用生成的主键,对自然复合键具有唯一的NOTNULL约束

如果使用自然键作为主键,则很可能必须在外键引用中引用这两个值,以确保标识正确的记录

  • 可能会给规范化带来更多问题(,“请注意,当1NF表没有复合候选键(候选键由多个属性组成)时,该表将自动处于2NF中”)
  • 更多不必要的数据重复。如果复合键由3列组成,则需要在用作外键的每个表中创建相同的3列
  • 通常可以通过代理键()的帮助避免
  • 我可以想象一个很好的复合键场景——在一个表示N:N关系的表中,如Students-Classes,中间表中的键将是(StudentID,ClassID)。但是如果您需要存储关于每一对的更多信息(比如一个类中一个学生的所有分数的历史记录),那么您可能会引入一个代理密钥
  • 当您在图表上使用它时,可读性会降低
  • 当您在查询中使用它时,连接的数量会减少 可读的
  • 当您在foregein键上使用它时 必须添加检查约束 几乎所有属性都必须是 空或不空(如果只有一个为空) null(未检查密钥)
  • 使用时通常需要更多的存储空间 作为外键
  • 某些工具无法管理组合 钥匙

  • 复合键本身并没有错,但主键在理想情况下应该尽可能小(就所需字节数而言)。如果主键很长,则会导致非聚集索引膨胀


    请记住,主键中列的顺序很重要。第一列应尽可能具有选择性,即尽可能“独特”。第一列上的搜索可以进行搜索,但第二列上的搜索必须进行扫描,除非第二列上还有非聚集索引。

    我认为这是合成键争论的一个专门化(是使用有意义的键还是任意合成主键)。出于一些原因,我几乎完全站在这场辩论的关键方面。以下是一些更相关的问题:

    • 你必须抚养孩子 外键末尾的表 最新的如果你改变主意 主键之一的值 字段(可能发生的情况-请参阅 (下图)你必须以某种方式改变 所有依赖表,其中 它们的PK值包括 领域。这有点棘手 因为更改键值将 使用使FK关系无效 子表,以便您可以(视情况而定 关于约束验证选项 在您的平台上可用)必须 采取复制文件之类的伎俩 记录到新记录并删除 旧唱片

    • 在深层模式中,键可以 相当宽-我看到了8列 一次

    • 主键值的更改可以是 在ETL中很难识别 进程从系统中加载。 我曾经有机会举的例子 这是一个MIS应用程序 从保险中提取 核保系统。在一些 在某些情况下,保单条目将 客户重复使用,更改 策略标识符。这是一个 的主键的一部分 桌子当这种情况发生时 仓库装载不知道是什么 旧值无效,因此无法匹配 新的数据将被添加到它。开发商 必须通过审计进行搜索 记录以标识更改的值


    非合成主键的大多数问题都与记录的PK值更改有关。非合成值最有用的应用程序是打算使用数据库模式的应用程序,例如M.I.S.应用程序,其中报表编写器直接使用表。在这种情况下,带有固定域(如货币代码或日期)的短值可以合理地直接放在表上以方便使用。

    使用复合主键的主要缺点是,您会混淆典型的ORM代码生成器。

    以具有两个候选键的表为例:一个简单主键(单列)和一个复合键(多列)。在这种情况下,您的问题似乎是,“如果我选择将一个键提升为‘主’键,而选择复合键,我会遇到什么不利条件?”

    首先,考虑一下你是否真的需要推广一把钥匙:"SQL中
    主键
    的存在本身似乎是某种历史上的偶然。根据作者Chris Date的说法,SQL的最早版本没有任何键约束,
    主键
    只是后来才添加到SQL标准中。标准的设计者显然是从E.F.Codd那里得到这个术语的尽管当时Codd最初的想法已经被抛弃,但他还是放弃了它!(Codd最初提出外键只能引用一个键——主键——但这个想法被遗忘和忽略了,因为它被广泛认为是一个毫无意义的限制)。“[来源:

    其次,您将应用什么标准来选择表中的哪个键应该是“主”键? 在SQL中,键
    主键
    的选择是任意的,并且是特定于产品的