MySQL-多表设计-一对多

多表的设计-概述

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:

  • 一对多(多对一)
  • 多对多
  • 一对一

一对多

  • 需求

    • 根据页面原型及需求文档,完成**部门(1:父表)员工(n:子表)**模块的表结构设计
    • 由于部门与员工的对应关系为一对多,所以在创建员工表时,设置一个属性指定当前员工属于哪一个部门
    • 具体代码如下
    sql 复制代码
    -- 创建员工表
    create table tb_emp
    (
        id          int unsigned primary key auto_increment comment '主键ID',
        username    varchar(20)                  not null comment '用户名',
        password    varchar(32) default '123456' null comment '密码',
        name        varchar(10)                  not null comment '姓名',
        gender      tinyint unsigned             not null comment '性别, 1 男, 2 女',
        image       varchar(300)                 null comment '图像url',
        job         tinyint unsigned             null comment '职位, 1 班主任 , 2 讲师 , 3 学工主管, 4 教研主管',
        entrydate   date                         null comment '入职日期',
        dept_id     int unsigned comment '归属部门的部门ID',
        create_time datetime                     not null comment '创建时间',
        update_time datetime                     not null comment '修改时间'
    ) comment '员工表';
    -- 创建部门
    create table tb_dept
    (
        id          int primary key auto_increment comment '部门ID',
        name        varchar(10) not null unique comment '部门名称',
        create_time datetime    not null comment '创建时间',
        update_time datetime    not null comment '更新时间'
    
    )
    • 由上述代码可知在员工表与部门表通过部门ID联系起来

    • 一对多关系的实现:只需要在多的一方,添加字段及员工模块的表结构设计

外键

物理外键

  • 概念
    • 使用 foreign key 定义外键关联另一张表
  • 缺点
    • 影响增删改查的效率
    • 仅用于节点数据库,不适用于分布式、集群的场景
    • 容易引发数据库的死锁问题,消耗性能

逻辑外键(推荐使用)

  • 概念
    • 在业务逻辑层中,解决外键联系
    • 通过逻辑外键可以解决上述问题

多表问题的分析

  • 在上述创建的tb_emp和tb_dept数据表中插入如下数据

  • 具体代码及运行结果如下:
    *

    sql 复制代码
    insert into tb_dept (id, name, create_time, update_time) values
            (1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),
            (4,'就业部',now(),now()),(5,'人事部',now(),now());
    
    INSERT INTO tb_emp
    	(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
    	(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
    	(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
    	(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
    	(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
    	(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
    	(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
    	(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
    	(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
    	(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
    	(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
    	(11,'luzhangke','123456','鹿杖客',1,'11.jpg',1,'2007-02-01',1,now(),now()),
    	(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',1,'2008-08-18',1,now(),now()),
    	(13,'fangdongbai','123456','方东白',1,'13.jpg',2,'2012-11-01',2,now(),now()),
    	(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
    	(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
    	(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),
    	(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());
    现象
    • 部门数据可以直接删除,然而删除之前的员工仍然显示归属于该被删除的部门,此时出现了数据的不完整和不一致的问题

    问题分析
    • 上述两张表,在数据库层面,并未建立联系(逻辑层面已经建立了联系),所以无法保障数据的一致性和完整性

外键约束

##### 外键语法

* **创建表时指定**
  *

    ```sql
    CREATE TABLE 表名
    (
        字段名 数据类型,
        .....
        [constraint] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (字段名)
    );
    ```

* **创建完表之后,添加外键**
  *

    ```sql
    ALTER TABLE 表名
        ADD CONSTRAINT 外键名称
            FOREIGN KEY (列外键字段名) REFERENCES 主表 (关联字段名);
    ```

* **在IDEA中对数据库中的操作主要使用图形化界面**

* 具体操作如下:

* 右击需要添加外键的数据表选择新建--\>外键,就会加入如下界面(具体页面会由于idea的版本的不同而有所差异)

* ![](https://file.jishuzhan.net/article/1681567159194488834/d2423deb6ad1403d9d60f436afe9c1a1.png)

* 外键创建好之后不能直接删除关联了外键的数据
相关推荐
阿华的代码王国1 分钟前
MySQL ------- 索引(B树B+树)
数据库·mysql
Hello.Reader29 分钟前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯31 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
liupenglove36 分钟前
golang操作mysql利器-gorm
mysql·golang
yanglamei196241 分钟前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
工作中的程序员1 小时前
ES 索引或索引模板
大数据·数据库·elasticsearch
严格格1 小时前
三范式,面试重点
数据库·面试·职场和发展
微刻时光1 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
单字叶2 小时前
MySQL数据库
数据库·mysql