MySQL-多表设计-一对多

news2024/12/1 10:45:43

多表的设计-概述

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

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

一对多

  • 需求
    • 根据页面原型及需求文档,完成部门(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.coloradmin.cn/o/768337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PostgreSQL内核学习(二)—— 查询分析】

查询分析 查询处理查询分析查询处理与查询分析的关系查询分析执行流程Lex和YaccLex:Yacc:词法分析工具Lex语法分析工具Yacc使用Lex和Yacc的案例 词法和语法分析以SELECT语句为例讲解 PostgreSQL中查询语句如何被解析并生成分析树。 语义分析 声明&#x…

【Vue面试题系列】四

VNode有哪些属性? Vue内部定义的Vnode对象包含了以下属性: __v_isVNode: true,内部属性,有该属性表示为Vnode __v_skip: true,内部属性,表示跳过响应式转换,reactive转换时会根据此属性进行判断…

黑马B站视频JAVA部分的知识范围、学习步骤详解

文章目录 学习资源选择最后选择 JAVA的知识范围JDBCswing与JAVAFX JAVA的学习步骤1.右侧的部分:2 JAVA的高级但是必须要学的3 有一些要学(部分)4力扣 总结作业配套资源 学习资源选择 我从画面(一定要看清代码)声音(清…

金融中的数学:概率分布(上)

概率分布是描述随机变量可能取值的概率的函数。它可以用来描述离散变量和连续变量的概率分布。对于离散变量的概率分布,我们称其为离散概率分布。对于连续变量的概率分布,我们称其为连续概率分布。本文主要介绍离散型概率分布。 1.离散型均匀…

华为ospf路由协议在局域网中的高级应用案例

关键配置: 1、出口为ospf区域0,下联汇聚依次区域1、2…,非骨干全部为完全nssa区域 2、核心(abr)上对非骨干区域进行路由汇总,用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

ngAfterViewInit( ) to early /// ngFor和异步网络请求导致无法选中目标元素的问题

今天遇到的最无语的问题: angular 8版本以上,我在ngafterViewInit()中选取元素选取不到,加上setTimeOut()之后才可以选中 网上的解释: Angular的ngAfterViewInit生命周期钩子是在组…

uniapp | 查看ios打包后的Info.plist文件

最近在用 uni 开发 ios 的时候给项目添加了自定义的 Info.plist 文件,但是打包后发现并没有生效,才有了查看打包后的 Info.plist 文件想法。 HBuilderX3.6.5起,支持直接在应用项目中配置 iOS 平台的 Info.plist 和 资源文件(Bundl…

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言: 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…

unity 2019 内置渲染管线 光照与Lighting面板 参数详解

文章目录 前言一 Unity的光照 与 烘焙光照1 unity完整的光照组成2 光的亮度与颜色3 全局光照直接光间接光5 间接光≠光照贴图 二 色彩空间与自动烘焙1 unity的色彩空间2 自动烘焙光照 三 烘焙1 什么是烘焙,烘焙的是什么2 如何进行烘焙3 烘焙的优点和缺点4 查看光照贴…

Redis : zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误&#xff1a;jemalloc/jemalloc.h&#xff1a;没有那个文件或目录 #include <jemalloc/jemalloc.h> 解决 : 如上图使用命令 make MALLOClibc

2023杭电多校(一)

1002 City Upgrading 类似题及其题解 City Upgrading Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 524288/131072 K (Java/Others) Total Submission(s): 306 Accepted Submission(s): 78 Problem Description The city where crazyzhk resides is stru…

分布式事务几种实现方案

前言 分布式事务&#xff1f; 分布式事务是指涉及多个参与者的事务&#xff0c;这些参与者可能分布在不同的计算机、进程或者网络中。分布式事务需要保证ACID属性&#xff0c;即原子性、一致性、隔离性和持久性 解释 现在我们接触的系统基本上都是分布式系统&#xff0c;并且每…

计算几何(二维),定理及证明(持续更新中..)

注&#xff1a;定理来自这篇博客&#xff0c;本文注重证明 向量基本运算 加法 向量 a ⃗ ( x 1 , y 1 ) , b ⃗ ( x 2 , y 2 ) \vec{a}\left(x_1,y_1\right),\vec{b}\left(x_2,y_2\right) a (x1​,y1​),b (x2​,y2​) 则 a ⃗ b ⃗ ( x 1 x 2 , y 1 y 2 ) \vec{a}\…

P7 第二章 电阻电路的等效变换

1、等效变换应用举例 化简套路&#xff1a; 电压源与其串联的电阻&#xff0c;可以等效为电流源并联电阻&#xff0c;然后电流源就可以拿去合并电路中的&#xff0c;与之并联的电流&#xff0c;电阻则可以拿去合并与之并联的电阻。 公式法&#xff1a; 就是根据端的电压与端的…

第一节 C++ 变量

文章目录 1. Visual Studio Community 安装1.1. Visual Studio 介绍1.2. Visual Studio的安装1.3 Visual Studio创建与使用1.3.1 创建一个工程项目1.3.2 新建一个C文件1.3.3 编写执行文件 2. Dev-C 安装(初学者建议使用)2.1 Dev-C 介绍2.2 Dev-C 安装2.3 Dev-C 快捷键使用 3. 认…

数学建模常用模型(九) :偏最小二乘回归分析

数学建模常用模型&#xff08;九&#xff09; &#xff1a;偏最小二乘回归分析 偏最小二乘回归&#xff08;Partial Least Squares Regression&#xff0c;PLS Regression&#xff09;是一种常用的统计建模方法&#xff0c;用于解决多元线性回归中自变量间高度相关的问题。在偏…

【java】三大容器类(List、Set、Map)的常用实现类的特点

三大容器类&#xff08;List、Set、Map&#xff09;的常用实现类的特点 简介 本文总结三大容器类&#xff08;List、Set、Map&#xff09;的常用实现类&#xff08;ArrayList、Vector、LinkedList、HashSet、HashMap、HashTable&#xff09;的特点 一、List部分 1、ArrayLi…

C# DlibDotNet 人脸识别、人脸68特征点识别、人脸5特征点识别、人脸对齐,三角剖分,人脸特征比对

人脸识别 人脸68特征点识别 人脸5特征点识别 人脸对齐 三角剖分 人脸特征比对 项目 VS2022.net4.8OpenCvSharp4DlibDotNet Demo下载 代码 using DlibDotNet.Extensions; using DlibDotNet; using System; using System.Collections.Generic; using System.ComponentModel; …

学堂在线数据结构(上)(2023春)邓俊辉 课后作业错题整理

The reverse number of a sequence is defined as the total number of reversed pairs in the sequence, and the total number of element comparisons performed by the insertion sort in the list of size n is: 一个序列的逆序数定义为该序列中的逆序对总数&#xff0c;…