• 开开心心带你学习MySQL数据库之第六篇上


    在这里插入图片描述

    ​ 💮 💮💮 只要路是对的,就不害怕遥远! 💮 💮💮

    🎆🎆🎆窗台是风景,笔下有前途,低头是题海,抬头是未来🎆🎆🎆

    ​ 🍂🍂🍂 如果没有躺赢的命,那就要站起来奔跑 🍂🍂🍂

    • not null => 要求元素非空
    • unique => 要求元素唯一
    • default => 指定默认值
    • primary => 主键 ~~自增主键,保证主键🆔不重复

    自增主键

    如果咱们的数据库是单机部署的.此时自增主键一般够用.

    如果是分布式部署的,感兴趣的话,可以看这篇博客:分布式系统中唯一 ID 的生成方法


    foreign key => 外键

    用于关联其他表的主键或唯一键 \color{#00f}{用于关联其他表的主键或唯一键} 用于关联其他表的主键或唯一键

    -- 语法
    foreign key (字段名) references 主表 ()  
    
    -- 班级表, classId设置成一个自增主键
    create table class(
        classId int primary key auto_increment, 
        className varchar(20)
    ); 
    
     -- 学生表, 使用studentId为主键,classesId为外键,关联班级表classId
    create table student(
        studentId int primary key auto_increment,
    	name varchar(20), 
        classId int, foreign key (classId) references class(classId)
    );
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    此时就要求 s t u d e n t 表中的每个记录的 c l a s s l d 得在 c l a s s 表的 c l a s s l d 中存在 ! ! ! \color{#F00}{此时就要求student表中的每个记录的classld得在class表的classld中存在!!!} 此时就要求student表中的每个记录的classld得在class表的classld中存在!!!

    image-20230907154529763
    student表受到class表的约束,就把class叫做student的父表(parent),student就是class的子表(child)

    -- 向class表插入1班,2班,3班,4班
    insert into class values(null,'1班');
    insert into class values(null,'2班');
    insert into class values(null,'3班');
    insert into class values(null,'4班');
    
    -- 查看一下class表,看是否插入成功
    select * from class;
    
    insert into student values(null,'张三',1);
    -- 学生张三的插入过程
    -- mysql就会先拿着这个记录的classld去class表中查一下看看有没有.
    -- 得是有,才能完成后续的插入!!!如果没有,插入失败!!
    
    -- 看一下student表,看是否插入成功
    select * from student;
    
    -- 更新失败,由于父表class对子表student的约束
    updata student set classId = 10 where studentId = 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    image-20230907154602117
      当你凝视深渊的时候 , 深渊也在凝视你   \color{#0F0}{~~ 当你凝视深渊的时候,深渊也在凝视你 ~~}   当你凝视深渊的时候,深渊也在凝视你  
    父表在约束子表的同时 , 子表也反向的约束了父表 \color{#0F0}{父表在约束子表的同时,子表也反向的约束了父表} 父表在约束子表的同时,子表也反向的约束了父表
    image-20230907155137504
    外键约束,针对子表是不能新增和修改 ~~新增和修改子表的数据不能超出父表的记录
    父表是不能删除和修改 ~~已经被子表依赖的数据是不能被删除掉的


    思考题

    电商类网站
    商品表(id, name, price…)
    商品表:id=1,name=衬衫,price=100
    订单表(orderld, userld, goodsld, time…)
    订单表:订单表中的goodsld得在商品表中存在 ~~外键约束
    问题:有一种情况,商品衬衫要下架!!!如何实现这个下架功能?如何把这个衬衫从商品表中删除掉??
    答:给商品表加一列,表示是否下架
    ~~此时实现下架并非是 delete 记录,而是 update 把是否下架字段进行修改
    ~~逻辑删除 => (数据不是真删了,而是标记成"无效")
    至于这个商品表里的记录会越来越多,那就加装硬盘就行了(硬盘空间不值钱)


    表的设计

    表的设计:设计要求有一定的经验,才能理解,如果是简单的场景,设计无从谈起.如何建表是比较明显的.
    根据需求,把表应该是啥样的写出来.有几个表,每个表干啥的,每个表有几个字段,都是干啥的,都是啥类型,有啥约束…

    设计表,分两步走
    1.梳理清楚需求中的"实体"
    2.梳理清楚实体之间的关系.
    3.按照关系,带入到既定的公式中,表就出来了

    实体: 面向对象 => 找对象 , 数据库中 => 找实体 需求中的关键性质的名词

    教务管理系统需要实现的功能
    要能管理所有的学生信息
    要能管理所有的教师信息
    要能管理所有的作业信息
    要能管理所有的课程信息

    上述表中的实体有: 学生 , 教师 , 作业 , 课程
    实体: 很多时候,每个实体就需要对应一张表来进行表示

    实体中的关系,主要有三种(严格的说是四种)

    1.一对一

    ​ 一个学生,只能有一个账号
    ​ 一个账号,只能供一个学生所有
    如何设计表:

    第一种: 弄一个大表,包含 账号信息 + 学生信息
    账号和学生表:account_student (accountld, username, password, studentName…);
    第二种: 弄两个表,相互关联
    账号表:account (accountld, username, password, s t u d e n t l d \color{#F0A}{studentld} studentld);
    学生表:student( s t u d e n t l d \color{#F0A}{studentld} studentld, name…);
    第三种: 搞两个表(推荐)⭐️⭐️⭐️
    account(accountId,username,password);
    student(accountld,studentld, studentName);
    后续可以弄一些教师表其它的,也能和account表关联

    2.一对多

    ​ 一个班级可以包含多个学生
    ​ 一个学生只能处于一个班级
    这种情况,也有两种典型的表示方式

    第一种❌❌❌
    student(studentld, name);
    class(classld, className, studentldList)
    studentldList => 用数组或者列表来保存学生🆔
    mysql没有数组类型,不能这么搞❗️❗️❗️但是有些数据库,比如redis,是有数组类型的.此时就可以考虑这样设计~~ redis用途非常多,最核心的用途,就是做缓存(cache)
    第二种⭐️⭐️⭐️ ~~ 最典型的一对多设计方式
    class表 => class( c l a s s I d \color{#F0A}{classId} classId , className);
    insert into class values(1, ‘1班’ );
    insert into class values(2, ‘2班’ );
    student表 => student(studentId , name, c l a s s I d \color{#F0A}{classId} classId);
    insert into student values(1, ‘大白’ ,1 );
    insert into student values(2, ‘大白’ ,2 );

    3.多对多

    ​ 一个学生可以选择多个课程
    ​ 一个课程也可以提供给多个学生

    student (studentId, name);
    --			1		'初一'
    --			2		'初二'
    course (courseId, name);
    --			1		'语文'
    --			2		'数学'
    
    --	   '需要弄一个关联表'
    student_course(studentId, courseId);
    --					1		1
    --					1		2
    --					2		1
    --  关联结果 => '初一'选了数学和语文
    -- 			   '初二'选了语文
    --			   '语文'这个课程提供给了'初一'和'初二'
    --			   '数学'这个课程提供给了'初一'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4.没关系(可省略)


    总结

    一般来说,只要实体和关系都明确了,此时表的设计就基本差不多了~~
    如果实体比较多,关系比较复杂,可以画一个“实体关系图"来表示这个关系~~
    ER图~~学校数据库课程考试,一定有一道大题是画ER图!!
    实际开发中,很少会画这个ER图~~ 即使画,也不必非得那么严格的遵守ER图的语法,大概画一下就行

  • 相关阅读:
    conan使用包以及管理(2)
    ansible copy模块--持续创作中
    利用角色roles上线wordpress项目
    JavaScript如何解决单线程缺陷——webWorker
    【OpenCV 例程200篇】215. 基于多段线绘制近似椭圆
    论文翻译:2023_THLNet: two-stage heterogeneous lightweight network for monaural speech enhancement
    PyCharm 无法登陆 Codeium 的解决方法
    MFC随记:AfxBeginThread创建工作线程
    【CPP_Primer_Plus】C++ IDE推荐
    不同的时钟机制
  • 原文地址:https://blog.csdn.net/m0_73740682/article/details/132745257