chapter07_多张表的数据库设计

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

猜你喜欢

转载自blog.csdn.net/captxb/article/details/87925515
今日推荐