模式schema:对数据库内的数据描述(列和表),任何相关对象,各种连接方式的描述的统称
解决不具有原子性的单表的问题 -- 拆分成多个具有原子性的表
-
主键:标识当前这个表的一个或一组属性
外键:对当前这个表来说未必是key,但是它是另一个表的主键。另一个表此时叫做父表(主表),父表中对应外键的主键叫做父键
-
外键
(1) 语句示例
CREATE TABLE table1 ( num11 int(11) NOT NULL AUTO_INCREMENT, num12 int(11) DEFAULT NULL, num13 int(11) DEFAULT NULL, PRIMARY KEY (num11) ); CREATE TABLE table2 ( num21 int(11) NOT NULL AUTO_INCREMENT, num22 int(11) DEFAULT NULL, num23 int(11) DEFAULT NULL, PRIMARY KEY (`num21`) ); CREATE TABLE table3 ( num31 int(11) DEFAULT NULL, num32 int(11) DEFAULT NULL, CONSTRAINT table1_num11_fk FOREIGN KEY (num31) REFERENCES table1 (num11), CONSTRAINT table2_num21_fk FOREIGN KEY (num32) REFERENCES table2 (num21) );
CONSTRAINT后面接的名字可以随便取,但是一般的规范是 父表名_父键_fk(代表foreign key)
(2) 外键的名字可以和主键的名字不同,例如示例中table3的外键名字分别叫 num31, num32,而他们对应的table1和table2中的主键的名字分别是num11和num21
(3) 外键所对应的父表中的父键,必须是父表中的主键
(4) 插入时,建立了外键约束的表的列只能有两种取值:NULL和关联的父表中的值
(5) 一张表可以有多个外键,例如示例中有两个外键
(6) 添加了外键约束以后,如果父表中的某一行的值已经称为从表的某一行的值,那么父表中该行的值不能被UPDATE(如果没有被从表取值则可以UPDATE),也不能被DROP COLUMN
-
数据模式
A:父表,B:从表,
(1) 一对一
A中的每一行,对应B中的一行或0行
使用时机:
不会经常使用这种模式,一般放在一个表里面就可以了;
但是,以下几种情况要使用一对一的表
1° 大多数只查询表中的某几列,此时可以把这几列抽出来一个表,加快查询速度
2° 有的列目前还不知道值只能用NULL代替,抽出来可以使得主表不会出现NULL
3° 有一大块数据时BLOB类型,一般放在另一张表里面
(2) 一对多
A中的某一行,对应B中的好几行; B中的某一行,只能对应A中的某一行
(3) 多对多
A中的某一行,对应B中的好几行; B中的某一行,也对应A中的好几行
此时需要增加一个联结表,变成 一对多 + 一对多模式
添加一个联结表C,使得A和C形成一对多关系,B和C也形成一对多关系
好处
1° 避免单表中出现大量重复数据,不方便查询
2° 降低耦合,便于修改
组合主键:多个列构成的键
-
依赖: x -> y
当 x列的值改变时,y列的值也跟随着改变
-
部分函数依赖
(x1, x2, x3) 构成表的组合主键,而y仅仅依赖于x1
-
传递函数依赖
改变任何非键列可能造成其他列的改变。
例如 (x1, x2)构成表的主键, y依赖于(x1,x2),而y的改变可以导致z的改变,即z依赖于y这一非键列,则为传递函数依赖
__采用单一人造主键(例如id)有利于避免部分函数依赖,因为所有的列都依赖于id。但是传递函数依赖不能靠单一人造主键解决
-
范式
(1) 1NF
原则1:数据列只包含具有原子性的值
原则2:没有重复的数据组
(2) 2NF
原则1:符合1NF
原则2:非主属性对候选键中的所有属性不存在部分函数依赖
(3) 3NF
原则1:符合2NF
原则2:非主属性对候选键中的属性不存在传递函数依赖
chapter07_多张表的数据库设计
最新推荐文章于 2022-10-14 20:57:28 发布