数据库2 domain cardinality degree 主键(PRIMARY KEY) 外键(FOREIGN KEY) 候选键(candidate key) 超键(SUPER KEY)

数据库中超键、候选键、主键的区分

超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键
候选键(candidate key):不含有多余属性的超键称为候选键
主键(primary key):用户选作元组标识的一个候选键程序主键

比如一个小范围的所有人,没有重名的,考虑以下属性:

身份证、姓名、性别、年龄。

  • 身份证 唯一 所以是一个超键
    姓名 唯一 所以是一个超键
    (姓名,性别) 唯一 所以是一个超键
    (姓名,性别,年龄) 唯一 所以是一个超键

–这里可以看出,超键的组合是唯一的,但可能不是最小唯一的

  • 身份证 唯一而且没有多余属性 所以是一个候选键
    姓名 唯一而且没有多余属性 所以是一个候选键

–这里可以看出,候选键是没有多余属性的超键

  • 考虑输入查询方便性,选择身份证为主键
    也可以考虑习惯,选择姓名为主键

–主键是选中的一个候选键

一题搞懂什么是候选键:

在SQL Server数据库中,有一个学生信息表如下所示,在该表中不能作为候选键的属性集合为( ) (选择一项)
学号 姓名 性别 年龄 系别 专业
20020612 李辉 男 20 计算机 软件开发
20060613 张明 男 18 计算机 软件开发
20060614 王小玉 女 19 物理 力学
20060615 李淑华 女 17 生物 动物学
20060616 赵静 男 21 化学 食品化学
20060617 赵静 女 20 生物 植物学
a{学号}
b{学号、姓名}
c{年龄、系别}
d{姓名、性别}
e{姓名、专业}

b
  • 透过概念,我们可以了解到,超键包含着候选键,候选键中包含着主键。主键一定是惟一的。为什么呢?因为他的爷爷超键就是惟一的。我们分析一下上面的题目,abcde5个答案都可以作为超键,他们组合在一起的集合可以用来惟一的标识一个实体。

  • 请注意我们的要求:候选键。候选键要求是不能包含多余属性的超键,我们看一下答案b。在答案b中,如果我们不使用姓名也可以惟一的标识一条数据实体,可以说姓名字段在这里是多余的。那么很明显,b选项包含了多余字段属性。那么这题答案应该选择b。

  • 那么其他的4个选项都可以作为候选键,假设很幸运,a)学号 被选择作为用户正在使用的候选键来惟一标识元组了,那么他很幸运的获得了主键的称号(主键->候选键)。


主键与外键都不是必须的,但是最好有,以达到第一范式的要求

- 主键 外键 索引
定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 该字段没有重复值,但可以有一个空值
作用: 用来保证数据完整性 用来和其他表建立联系用的 提高查询排序的速度(常用于经常被查询的且不是主键的列)
个数: 主键只能有一个(某个主键的字段可以有很多) 一个表可以有多个外键 一个表可以有多个惟一索引

有关主键与外键的自动增长

如果为表指定了 PRIMARY KEY 约束,则 数据库引擎将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可用来对数据进行快速访问。因此,所选的主键必须遵守创建唯一索引的规则。

如果对多列定义了 PRIMARY KEY 约束,则一列中的值可能会重复,但来自 PRIMARY KEY 约束定义中所有列的任何值组合必须唯一。

如下图所示,Purchasing.ProductVendor 表中的 ProductID 和 VendorID 列构成了针对此表的复合 PRIMARY KEY 约束。这确保了 ProductID 和 VendorID 的组合是唯一的。

foreign key

对于表R1中的主键的所有列{A1,A2,…},如果R2使用了对R1的外键,则必须包括R1中的这些列{A1,A2,…},且列名与R1的完全相同,为A1…(如均为ID)

否则会出现:出错:此列列表的唯一关键字或主键不匹配

A我创建主键约束是这样的
CONSTRAINT tab_t_pk PRIMARY KEY (tab_col1,tab_col2)
B表我建立外键约束的是
CONSTRAINT tab_t_fk FOREIGN KEY (tab_col1) REFERENCES A(tab_col1)
A中是复合主键,B中的外键却只关联a中的一个字段,导致不唯一

[链接:复合(或联合)主键是包括多个列的键](http://www.iteye.com/problems/99260)

尽量使用单一键,比如无意义的自增数做主键。联合主键会增加复杂度,稍有改动则后果严重,如身份证的位数变化

mysql中的unique key(唯一键)可防止此类警告:

mysql中key 、primary key 、unique key 与index区别

create table t_test1(
id_1 varchar2(4),
id_2 varchar2(4),
other varchar2(50));

create table t_test2(
id_1 varchar2(4),
other varchar2(50));

//设置t_test1的主键:

alter table t_test1 add constraint pk_1 primary key(id_1,id_2);

//设置t_test2的外键 t_test2.id_1 参照 t_test2.id_1 出错:

alter table t_test2 add constraint fk_1 foreign key(id_1) references t_test1(id_1);

出错:此列列表的唯一关键字或主键不匹配
原来是id_1不惟一的原因,添加惟一性约束就能解决问题

alter table t_test1 add constraint uqn_1 unique(id_1);

alter table t_test2 add constraint fk_1 foreign key(id_1) references t_test1(id_1);

另一例:

OPER@tl>create table test(aaa number,bbb number,primary key(aaa,bbb));
表已创建。
OPER@tl>create table test2(aaa number references test(aaa));
create table test2(aaa number references test(aaa))

第 1 行出现错误:
ORA-02270: 此列列表的唯一关键字或主键不匹配

OPER@tl>alter table test add constraint xx unique(aaa);
表已更改。
OPER@tl>create table test2(aaa number references test(aaa));
表已创建。


  • FOREIGN KEY 约束并不仅仅可以与另一表的 PRIMARY KEY 约束相链接,它还可以定义为引用另一表的 UNIQUE 约束。
  • FOREIGN KEY 约束可以包含空值,但是,如果任何组合 FOREIGN KEY 约束的列包含空值,则将跳过组成 FOREIGN KEY 约束的所有值的验证。若要确保验证了组合 FOREIGN KEY 约束的所有值,请将所有参与列指定为 NOT NULL。

FOREIGN KEY 约束可以引用同一数据库的表中的列或同一表中的列。这些称为“自引用”表。例如,请考虑包含三列的一个雇员表:employee_number、employee_name 和 manager_employee_number。由于经理本身也是雇员,所以从 manager_employee_number 列到 employee_number 列存在外键关系。

domain

术语:属性在domain中得到其值

attribute A1 draws its values from the domain D1, A2 from D2
在同一domain(同一数据类型)的attribute可以进行比较
domain是否可以为NULL需要在一开始时确定

集合的属性数量称为度(degree),行的数量称为势(cardinality)


引用完整性

1. 尽管 FOREIGN KEY 约束的主要目的是控制可以存储在外键表中的数据,但它还可以控制对主键表中数据的更改。例如,如果在 Sales.SalesPerson 表中删除一个销售人员行,而这个销售人员的 ID 由 Sales.SalesOrderHeader 表中的销售订单使用,则这两个表之间关联的完整性将被破坏;SalesOrderHeader 表中删除的销售人员的销售订单因为与 SalesPerson 表中的数据没有链接而变得孤立了。

2. FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改将无法实现,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束中的值相对应,则该操作将失败。若要成功更改或删除 FOREIGN KEY 约束的行,必须先在外键表中删除或更改外键数据,这将把外键链接到不同的主键数据上去。

对 FOREIGN KEY 约束建立索引

由于以下原因,对外键创建索引通常是有用的:

  • 对 PRIMARY KEY 约束的更改可由相关表中的 FOREIGN KEY 约束检查。

  • 当在查询中组合相关表中的数据时,经常在联接条件中使用外键列,方法是将一个表的 FOREIGN KEY 约束中的列与另一个表中的主键列或唯一键列匹配。索引使 数据库引擎可以在外键表中快速查找相关数据。但是,创建此索引并不是必需的。即使没有对两个相关表定义 PRIMARY KEY 或 FOREIGN KEY 约束,也可以对来自这两个表中的数据进行组合,但两个表间的外键关系说明已用其键作为条件对其进行了优化,以便组合到查询中。

表中的 FOREIGN KEY 约束数

SQL Server 对一个表可以包含的 FOREIGN KEY 约束(引用其他表)数没有预定义限制,对引用特定表的其他表所拥有的 FOREIGN KEY 约束数也没有预定义的限制。但是,实际的 FOREIGN KEY 约束数会受到硬件配置以及数据库和应用程序的设计的限制。建议表中包含的 FOREIGN KEY 约束不要超过 253 个,并且引用该表的 FOREIGN KEY 约束也不要超过 253 个。在设计数据库和应用程序时应考虑强制 FOREIGN KEY 约束的开销。

posted @ 2016-05-09 20:42  panty  阅读(819)  评论(0编辑  收藏  举报