MySQL-多表设计-一对多

多表的设计-概述

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

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

一对多

  • 需求
    • 根据页面原型及需求文档,完成部门(1:父表)员工(n:子表)模块的表结构设计

    •  
    • 由于部门与员工的对应关系为一对多,所以在创建员工表时,设置一个属性指定当前员工属于哪一个部门
    • 具体代码如下
    • -- 创建员工表
      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数据表中插入如下数据
  • 具体代码及运行结果如下:
    • 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());
      
    • 现象
      • 部门数据可以直接删除,然而删除之前的员工仍然显示归属于该被删除的部门,此时出现了数据的不完整和不一致的问题

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

    • 外键语法
      • 创建表时指定
        • CREATE TABLE 表名
          (字段名 数据类型,.....[constraint] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (字段名)
          );
      • 创建完表之后,添加外键
        • ALTER TABLE 表名ADD CONSTRAINT 外键名称FOREIGN KEY (列外键字段名) REFERENCES 主表 (关联字段名);
      • 在IDEA中对数据库中的操作主要使用图形化界面

      • 具体操作如下:

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

      •  外键创建好之后不能直接删除关联了外键的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28960.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hydro】一个简单的HBV水文模型产流Python实现

说明 HBV模型包括一系列自由参数,其值可以通过率定得到。同时也包括一些描述流域和气候特征的参数,它们的值在模型率定是假定不变。子流域的划分使得在一个子流域中可能有很多参数值。虽然在大多数应用中,各子流域之间参数值只有很小的变化&a…

学生宿舍智能电表限电原理

学生宿舍智能电表限电石家庄光大远通电气有限公司生产销售系列学生公寓智能管理模块、学生公寓智能控电水电联控系统及相关公寓安全用电产品,产品销往全国各地,广泛应用于各种学校公寓物业及商业地产公司,为企事业单位物业管理提供便捷的水电…

Go语言之结构体

在实际开发中,我们可以将一组类型不同的、但是用来描述同一件事物的变量放到结构体中。例如,在校学生有姓名、年龄、身高、成绩等属性,学了结构体后,我们就不需要再定义多个变量了,将它们都放到结构体中即可。 在Go语言…

uni-app:scroll-view滚动盒子,实现横(纵)向滚动条

参照&#xff1a;scroll-view | uni-app官网 (dcloud.net.cn) 样式&#xff1a; 代码&#xff1a; <template><view class"box"><scroll-view scroll-x"true" class"scroll"><view class"box1"> <view c…

MySQL八股学习记录6-日志from小林coding

MySQL八股学习记录6-日志from小林coding MySQL日志分类undo logBuffer Poolredo logbinlogredo log 和undo log有什么区别主从复制是如何实现update语句执行过程为什么需要两阶段提交 MySQL日志分类 undo log:InnoDB存储引擎层生成的日志,实现事务中的原子性,主要用于事务回滚…

Linux进程控制(二)---进程等待

目录 什么是进程等待 为什么要进行进程等待&#xff1f; wait() waitpid() status的使用★ options★ 问题&#xff1a;既然进程具有独立性&#xff0c;进程退出码不也是子进程数据吗&#xff0c;父进程凭什么拿到呢&#xff1f;wait/waitpid究竟做了什么呢&#xff1f; …

Spring Cloud Hystrix简单实用

文章目录 一、简介二、快速开始1、pom依赖2、启动类注解3、服务降级配置HystrixCommand4、配置熔断策略5、测试 三、原理分析四、实际使用 一、简介 Hystrix&#xff0c;英文意思是豪猪&#xff0c;全身是刺&#xff0c;刺是一种保护机制。Hystrix也是Netflflix公司的一款组件。…

Kotlin获取Fragment中的组件

左边和右边分别是两个不同的Fragment&#xff0c;左边的Fragment中右一个Button组件&#xff0c;目标是想要获取这个组件的id&#xff0c;以便进行将右边的Fragment更改成另一个Fragmeent的操作。 left_fragment.xml <?xml version"1.0" encoding"utf-8&qu…

玩玩两个简单的python的web框架 flask、fastapi

IDEA连接远程解释器&#xff0c;本地代码编辑无法代码提示 一、Flask入门使用 官网 其它参考 注意 1.这里使用linux 192.168.72.126上远程解释器,需要/usr/bin/pip3 install flask&#xff0c;host参数不要使用localhost/127.0.0.1,即只监听本地的访问&#xff0c;会导致wind…

手机定屏死机问题操作指南

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、定屏死机问题抓取 Log 要求二、 复现定屏死机问题后做什么三、检查adb是否可连的方法四、连接adb 抓取以下Log五、如果adb不可连&#xff0c;执行下…

IDEA实用设置及插件

一、IDEA实用设置 二、IDEA实用插件 1. aiXcoder是一个基于最先进的深度学习技术的强大的代码完成器和代码搜索引擎。它有可能向您推荐一整行代码&#xff0c;这将帮助您更快地进行编码。AiXcoder还提供了一个代码搜索引擎&#xff0c;帮助您在GitHub上搜索API用例。 2. 阿里…

【iOS】—— 面向对象,Runtime,ARC等问题总结

对于暑假学习大多数是对之前学习的一个复习&#xff0c;在这里只做对之前学习欠缺知识的补充以及这些知识点涉及的一些问题&#xff0c;从问题入手学习。 文章目录 面向对象1.一个NSObject对象占多少内存&#xff1f;2.对象的isa指针指向哪里&#xff1f;3.OC的类信息存放在哪…