在 SQL 中,是复合键还是复合键?

igo*_*ard 35 database-design terminology

关于 SQL(计算/数据库):

当我们在一个表中有两个或多个字段共同唯一地标识其记录时,调用它们的正确方法是什么?复合键还是复合键?

我在网上看到两种用法,所以我不太确定。

nvo*_*gel 35

复合键和复合键都描述了具有多个属性的候选键。根据关系数据库词典 (CJDate),它们的含义相同。

在 ER 建模中,术语“复合键”也有更具体的含义。它意味着一个键,其组成属性是对其他实体中键的引用——即复合键形成识别关系。对于大多数目的,这不是一个特别有用或重要的概念,因此术语复合/化合物通常被视为可互换的。除非您特指复合键的 ER 建模概念,否则最好坚持使用“复合键”。

  • “在 ER 建模中,术语“复合键”也有更具体的含义”——听起来很有说服力 :) 但是你有引用吗? (3认同)

jco*_*and 23

我仍然不确定为什么没有咨询http://en.wikipedia.org/wiki/Compound_key。它非常清楚地说明(并且是正确的):

在数据库设计中,复合键是由 2 个或多个唯一标识实体出现的属性组成的键。组成复合键的每个属性本身就是一个简单的键。

这通常与复合键混淆,即使这也是由 2 个或多个唯一标识实体事件的属性组成的键,但构成复合键的至少一个属性本身并不是一个简单的键。

复合键由可能是也可能不是外键的元素组成。示例:在交易明细表中,键是(TransactionId, ItemNumber)。交易明细是交易的子实体。TransactionId 是外键,引用 Transactions 表。ItemNumber 本身并不是一个键。它仅在单个事务的上下文中唯一标识一个项目。

复合键是一种键,其中键的任何部分都是外键。示例:在酒店预订系统中,预订具有复合键(GuestId、HotelId、ArrivalDate)。GuestId 标识访客,并引用访客表。HotelId 标识酒店,并引用酒店表。ArrivalDate 标识一个日期。可能有也可能没有它引用的日期表,但它以任何一种方式标识一个实体(日期)。

同样值得注意的是这个事实:简单键是由一列组成的键,而复合键是由两列或更多列组成。

  • jcolebrand:“复合键是一种键,键的任何部分都可以通过该键识别记录。” 那是不正确的。根据定义,键必须是不可约的(最小超键)。如果只需要某些属性来唯一标识一个元组,那么根据定义,它是一个超级键而不是一个键。 (4认同)
  • 不过,我认为您错过了相关要点,即复合键由 * 来自其他实体 * 的键组成。键的适当子集不可能是键。我相信你知道,一个键必须是最小的(在它是一个键的表中)——所以如果你从中删除任何属性,那么它就不再是一个键了。 (2认同)
  • 维基百科页面上的“**复合键**”和“**复合键**”的定义已于2014年7月13日更改,不再与本答案中的定义匹配。(我没有更改定义,只是指出定义现在不匹配。) (2认同)