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)

* 外键创建好之后不能直接删除关联了外键的数据
相关推荐
做梦敲代码14 分钟前
达梦数据库-读写分离集群部署
数据库·达梦数据库
苹果醋31 小时前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行1 小时前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger1 小时前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud1 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库