超级密钥和候选密钥之间有什么区别?

Din*_*mar 45 database

超级密钥和候选密钥之间有什么区别?我已经提到过wiki,dotnet spider以及Database Concepts第4版的书.但我无法理解这个概念.任何人都可以用适当的例子解释一下吗?

Qua*_*noi 77

Candidate key是一个super key你无法从中删除任何字段.

例如,可以通过主要/次要版本或构建日期(我们假设每晚构建)来识别软件版本.

在三个字段中存储日期当然不是一个好主意,但让我们假装它是出于演示目的:

year  month date  major  minor
2008  01    13     0      1
2008  04    23     0      2
2009  11    05     1      0
2010  04    05     1      1
Run Code Online (Sandbox Code Playgroud)

所以(year, major, minor)或者(year, month, date, major)是超级密钥(因为它们是唯一的)而不是候选密钥,因为你可以删除year或者major剩下的一组列仍然是超级密钥.

(year, month, date)并且(major, minor)是候选键,因为您不能在不破坏唯一性的情况下从中删除任何字段.

  • @Quassnoi:如果你从超级键 `(year, month, date)` 中删除 `date` 会怎样。密钥仍然是唯一的。有`(year, month, date)` 不是候选键吗? (3认同)
  • @Patryk:请重新阅读:*我们假设每晚构建*. (3认同)

Jon*_*ler 23

超级键是唯一标识表中行的列的任意组合.候选键是超级键,在不丢失唯一标识属性的情况下不能从中删除任何列.此属性有时称为最小性或(更好)不可约性.

超级密钥≠通常是主键.主键只是选择作​​为主键的候选键.然而,在依赖性理论中,候选密钥是重要的,并且主密钥并不比任何其他候选密钥更重要.非主要候选键也称为替代键.

考虑这个元素表:

CREATE TABLE elements
(
    atomic_number   INTEGER NOT NULL PRIMARY KEY
                    CHECK (atomic_number > 0 AND atomic_number < 120),
    symbol          CHAR(3) NOT NULL UNIQUE,
    name            CHAR(20) NOT NULL UNIQUE,
    atomic_weight   DECIMAL(8,4) NOT NULL,
    period          SMALLINT NOT NULL
                    CHECK (period BETWEEN 1 AND 7),
    group           CHAR(2) NOT NULL
                    -- 'L' for Lanthanoids, 'A' for Actinoids
                    CHECK (group IN ('1', '2', 'L', 'A', '3', '4', '5', '6',
                                     '7', '8', '9', '10', '11', '12', '13',
                                     '14', '15', '16', '17', '18')),
    stable          CHAR(1) DEFAULT 'Y' NOT NULL
                    CHECK (stable IN ('Y', 'N'))
);
Run Code Online (Sandbox Code Playgroud)

它有三个唯一标识符 - 原子序数,元素名称和符号.因此,这些中的每一个都是候选键.此外,除非您正在处理只能保存一行数据的表(在这种情况下,空集(列)是候选键),否则您不能拥有小于一列的候选键,所以候选键是不可简化的.

考虑由{原子序数,元素名称,符号}组成的密钥.如果为这三个字段(例如{6,Carbon,C})提供一组一致的值,则可以唯一标识元素的条目 - Carbon.然而,这是一个非常重要的超级密钥,因为它不是不可简化的; 您可以消除三个字段中的任何两个而不会丢失唯一标识属性.

另一个例子,考虑由{atomic number,period,group}组成的密钥.同样,这是一行的唯一标识符; {6,2,14}确定碳(再次).如果它不是镧系元素和Actinoids,那么{period,group}的组合将是独特的,但由于它们,它不是.但是,和以前一样,原子序数本身就足以唯一地标识一个元素,因此这是一个超级密钥而不是候选密钥.


Sha*_*ngh 16

超级密钥是字段的组合,通过该字段唯一地标识行,并且候选密钥是最小超级密钥.


K.S*_*gar 5

一个Super键是一组或多列唯一标识表中的行之一。

候选密钥是从超级密钥集中选择的,选择候选密钥时我们要注意的唯一事情是:它不应具有任何冗余属性。因此,它们也被称为最小超级键。

Employee表中有三列:Emp_Code,Emp_Number,Emp_Name

超级键:

以下所有集合都能够唯一地标识employee表的行。

{Emp_Code}
{Emp_Number}
{Emp_Code, Emp_Number}
{Emp_Code, Emp_Name}
{Emp_Code, Emp_Number, Emp_Name}
{Emp_Number, Emp_Name}
Run Code Online (Sandbox Code Playgroud)

候选键:

如前所述,它们是没有冗余属性的最小超级键。

{Emp_Code}
{Emp_Number}
Run Code Online (Sandbox Code Playgroud)

首要的关键:

数据库设计者正在从候选键集中选择主键。因此,{Emp_Code}或者{Emp_Number}可以是主键。


小智 5

超级密钥的实体集的是一组的值唯一地确定每个实体的一个或多个属性。

一个候选键的实体集是最小的超级关键

让我们继续使用客户、贷款和借款人集,您可以从链接中找到图像??1

  • 矩形代表实体集 ?? 1
  • 菱形代表关系集??1
  • 省略号代表属性??1
  • 下划线表示主键 ?? 1

CUSTOMER_ID候选键顾客设置的loan_number候选键贷款集合。

尽管可能存在多个候选键,但选择候选键之一作为主键。

借款人集由customer_idloan_number作为关系集形成。