• 模式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:非主属性候选键中的属性不存在传递函数依赖