使用复合/复合主键有哪些缺点?
答案 0 :(得分:14)
答案 1 :(得分:5)
复合键本身没有任何问题,但理想情况下主键应尽可能小(根据所需的字节数)。如果主键很长,那么这将导致非聚集索引膨胀。
请记住,主键中列的顺序很重要。第一列应尽可能具有选择性,即尽可能“独特”。搜索第一列将能够搜索,但只搜索第二列必须扫描,除非第二列上还有非聚集索引。
答案 2 :(得分:4)
我认为这是合成密钥辩论的一种特殊化(是否使用有意义的密钥或任意合成主密钥)。出于多种原因,我几乎完全退出本次辩论的综合关键方面。这些是一些更相关的:
你必须保持受抚养的孩子 表格在foriegn键的末尾 最新。如果你改变了 其中一个主键的值 字段(可能发生 - 见 下面)你必须以某种方式改变 所有依赖表在哪里 他们的PK值包括这些 领域。这有点棘手 因为改变键值会 使FK关系无效 儿童表所以你可以(依赖 关于约束验证选项 在您的平台上可用)必须 诉诸抄袭的伎俩 记录到新的并删除 旧记录。
在深层架构上,密钥可以获得 很宽 - 我见过8列 一次。
主键值的更改可以是 在ETL中识别很麻烦 加载系统的进程。 我曾经有过的例子 看到的是一个MIS应用程序 从保险中提取 承销制度。一些 政策条目的场合 改变了客户的重用 政策标识符。这是一个 部分主键 表。当这发生时 仓库负载不知道是什么 旧的价值是如此无法比拟 它的新数据。开发者 不得不去审核 记录以识别更改的值。
非合成主键的大多数问题都围绕着记录的PK值发生变化时的问题。非合成值的最有用的应用程序是打算使用数据库模式的地方,例如M.I.S.报表编写者直接使用表的应用程序。在这种情况下,为方便起见,可以合理地将具有固定域(如货币代码或日期)的短值直接放在桌面上。
答案 3 :(得分:1)
我建议在自然复合键上使用唯一的非空约束的情况下生成主键。
如果您使用自然键作为主键,那么您很可能必须在外键引用中引用这两个值,以确保您正在识别正确的记录。
答案 4 :(得分:1)
以带有两个候选键的表为例:一个简单(单列)和一个复合(多列)。你在这种情况下的问题似乎是,“如果我选择将一把钥匙提升为'主要'并选择复合钥匙,我可能会遭受哪些不利影响?”
首先,考虑一下你是否真的需要提升一个密钥:“SQL中PRIMARY KEY
的存在似乎是某种历史性事故。根据作者Chris Date最早的SQL版本没有任何关键限制,PRIMARY KEY
后来才被添加到SQL标准中。标准的设计者显然接受了发明它的EFCodd这个术语,尽管那时Codd的原始概念已被抛弃了! (Codd最初提出外键必须只引用一个键 - 主键 - 但这个想法被遗忘和忽略,因为它被广泛认为是一个无意义的限制)。 [来源:David Portas' Blog: Down with Primary Keys?
其次,您应该选择什么标准来选择表中的哪个键应该是“主要”?
在SQL中,键PRIMARY KEY
的选择是任意的和产品特定的。在ACE / Jet(又名MS Access)中,两个主要且经常相互竞争的因素是您是否希望使用PRIMARY KEY
来支持磁盘上的群集,或者您是否希望包含密钥的列在“关系”中显示为粗体MS Access用户界面中的图片;我认为索引策略胜过漂亮的图片我占少数:)在SQL Server中,您可以独立于PRIMARY KEY
指定聚集索引,并且似乎没有提供特定于产品的优势。唯一剩下的优势似乎是在SQL DDL中创建外键时可以省略PRIMARY KEY
的列,这是一个SQL-92标准行为,无论如何对我来说似乎没什么大不了的(也许是他们添加到标准中的另一个因素,因为它是SQL产品中已经普及的一个功能?)因此,它不是寻找缺点的情况,而是应该看看优势,如果有的话,您的SQL产品会提供PRIMARY KEY
。换句话说,选择错误密钥的唯一缺点是你可能错过了一个给定的优势。
第三,您是否提到使用人工/合成/代理键在您的物理模型中从您的逻辑模型中实现候选键,因为您担心如果在外键中使用自然键,将会有性能损失表加入?这是一个完全不同的问题,很大程度上取决于你对SQL中自然键问题的“宗教”立场。
答案 5 :(得分:0)
需要更多特异性。
太过分了,它可能会过度复杂化插入(每个键必须存在)和文档,如果不完整,你的联合读取可能会被怀疑。
有时它可以指示一个有缺陷的数据模型(复合键真的是数据所描述的吗?)
我不相信会有性能成本......它真的很容易出错。
答案 6 :(得分:0)
答案 7 :(得分:0)
使用复合主键的主要缺点是,你会混淆典型的ORM代码生成器。