超级密钥和候选密钥之间有什么区别?我已经提到过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)是候选键,因为您不能在不破坏唯一性的情况下从中删除任何字段.
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}的组合将是独特的,但由于它们,它不是.但是,和以前一样,原子序数本身就足以唯一地标识一个元素,因此这是一个超级密钥而不是候选密钥.
一个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}可以是主键。