• 多表关联


    为什么建立分表

    只使用一个表的话:

      1.重复数据,浪费空间

      2.数据结构混乱

      3.扩展性差

    什么时候分表

      当出现大量重复数据时

      当一条记录中的数据 不属于同一类时

     

    分表之后,几个表之间存在内在的关系,就需要联合在一起,就会存在:多对多,一对多,一对一的关系。

    必须找到一种方法,可以在物理层面建立关联关系

      解决方案:外键约束

    外键约束的具有的约束

    第一种约束:先建主表,再建从表

    第二种约束:先插入主表,插入从表

    第三种约束:先删从表记录,再删主表记录

    第四种约束:从表更新外键,必须保证外键存在

    第五种约束:更新主表的id时,必须先删除从表关联数据

    第六中约束:删除主表,要先删除从表。

    有了这几个约束后,主表和从表中的数据必然是完整的

    一对多的关系的实例

    员工与部门的关系,一个部门可以有多个员工。员工只有一个部门。

    #先建立主表,主表指的是没有外键的表

    create table dpt(id int primary key auto_increment,name char(10));

    #部门表没有外键,员工表有外键

    -> create table emp (id int primary key auto_increment,name char(10),dpt_id int,
    -> foreign key (dpt_id) references dpt(id));

    mysql> #数据插入先主表,后从表
    -> insert into dpt values (null,"市场部"),(null,"人事部");

    mysql> insert into emp(name,dpt_id) values ("张三丰",1),("扫地僧",2),('张无忌',1),("虚竹",2);

    #插入从表的数据的外键必须是主表有的才可以插入

    对于一对多的关系,建立联系,需要确定其中主表,与从表。主表再逻辑上是先于从表的数据生成的。

    多对多的关系的实例

    多对多的关系,是建立一张从表,将学生表和老师表作为主表,关系表作为从表。

    create table teacher (id int primary key auto_increment,name char(10),salary int,course char(10));

    create table student (id int primary key auto_increment,name char(10));

    mysql> create table tsr (id int primary key auto_increment,tid int,sid int,
    -> foreign key (tid) references teacher(id),
    -> foreign key (sid) references student(id));

    insert into teacher(name,salary,course) values ("egon",30000,"python"),("hu",20000,"python");

    insert into student(name) values ("msj"),("lyh");

     insert into tsr(tid,sid) values (1,1),(1,2),(2,1),(2,2);

    一对一的关系实例

    常用信息与详细信息之间的关系就是一对一,一对一除了外键需要添加,还需要添加唯一性表示符。

     create table basic_info (id int primary key auto_increment,name char(10),gender enum("m","w"),age int);

    create table det_info (id int primary key auto_increment,height int,weight int,b_id int unique,
    -> foreign key (b_id) references basic_info(id));

    insert into basic_info values(null,"杨元虎","m",18)

    insert into det_info values (null,180,75,1);

    级联约束

    对于主表数据的操作可能影响到从表的数据(从表的外键与主表的主键紧密关联),所以外键约束对主表的删除和修改都会严格要求。

    一般来说想要删除主表中一条数据,需要将从表中的相关的数据全部删除或修改,才能正确删除。

    这是就有了级联约束。

    设置 on delete cascade

      on update cascade

    on delete cascade 当主表删除记录时 从表相关联的记录同步删除
    on update cascade 当主表id更新时 从表相关联的记录同步更新
    注意是单向的 主表变化是 级联操作从表 从表的变化不会级联到主表

     

  • 相关阅读:
    MySQL 5.7 在windows下修改max_allowed_packet变量
    linux(redhat)安装jdk1.8
    linux安装jdk1.8之后报错Error: dl failure on line 893的解决办法
    Java中List Set Map 是否有序等总结
    面试题吐槽系列之一
    面试算法——快速排序
    推荐系统——online(上)
    推荐系统架构
    零基础开始推荐系统
    视觉显著性优秀硕士论文总结
  • 原文地址:https://www.cnblogs.com/msj513/p/9995929.html
Copyright © 2020-2023  润新知