MySQL——约束与表的设计基础

·前言

        本篇文章主要介绍数据库约束以及数据库中有关表设计的一些基础知识,文章会尽量都用实例进行直观的讲解与展示每个知识点的意义,现在就开始今天的学习吧!!

一、数据库约束

1.约束概述

        约束,就是在创建表的时候给这个表指定一些规则,在后续插入、修改与删除时都要保证数据能够遵守这些规则,引入这些规则是为了进行更强的数据检查及校验,这是因为数据是非常重要的,所以数据一定要确保正确,规则引入后,再进行插入、修改与删除等操作时,一旦数据不符合规则,就会报错,报错就是把问题提前告诉我们,以免酿成大错。

2.约束类型

约束类型
类型说明
not null指示某列不能储存null值
unique保证某列的每行必须有唯一值
default规定没有给列赋值时的默认值
primary keynot null与unique的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定记录。
foreign key保证一个表中的数据匹配另一个表中的值的参照完整性。

(1)NOT NULL

        创建表时,可以指定某列不为空:

(2)UNIQUE

        指定id列为唯一的、不重复的:

        加上unique约束之后,后续进行插入、修改的时候都会先进行查询,看看当前这个值是否已经存在,从此可以看出,约束能够引入更多的检查操作,同时也会增加系统的开销。 

(3)DEFAULT

        指定插入数据时,当name列为空时默认值是“无名氏”,id列为空时默认值是0:

        默认情况下,默认值就是NULL,进行指定列插入时,其他未被指定的列就会被设置成默认值,由于在很多时候,返回一个NULL值时是一个不好的体验,所以引入DEFAULT约束对NULL的元素默认值加以调整。 

(4)PRIMARY KEY

        指定id列为主键:

        在设置主键的时候,我们往往会使用一个XXX id这样的列作为主键,同时,一个表中只能有一个主键,除了基础的使用之外,还有一种情况是联合主键,就是只有一个主键,这个主键是由多个列联合构成的,在这我就不过多介绍了。

        主键不允许重复,那么具体要怎么做才能保证它不重复呢?在MySQL中,提供了一种机制:“自增主键”,具体用法如下:

        上述的自增主键,只能在单个数据库下生效,如果数据库是由多个MySQL服务器构成的“集群”,此时自增主键就无法生效了,这是因为表中数据特别多的时候,需要多台机器进行储存,此时多台机器的主键就是各自自增各自的了,这就可能导致不同机器中数据的id重复,但实际上我们引入“主键”是不希望会重复的,这时为了确保一个分布式系统中,能够存在唯一id,业界也会有一些分布式系统生成唯一id的算法,当然这类算法有很多,大同小异,基本思路就是将主键设置成字符串类型,然后大致按如下方法:

        时间戳(ms,us)        +         主机编号        +        随机因子

        这里时间戳为了保证不同时刻生成的数据的id是不同的,主机编号是为了在同一时刻生成多个数据时,只要这几个数据是在不同主机上,仍然可以通过主机编号确保不重复,随机因子,预防的就是同一时刻,同一个主机上生成了多个数据,这时候就可以针对这多个数据id再通过随机因子进行区分,当然出现这种情况的数据不会太多,所以也不太会出现重复的情况。

(5)FOREIGN KEY

        外键用于关联其他表的主键唯一键,语法:

foreign key (字段名) references 主表(列) 

 

        引入外键约束,就是为了解决上面这种问题,希望学生表中的class_id都要在班级表中存在,此时就可以使用外键约束进行校验,这就要求本表中的这个列的数据必须要在引用的外面的表的对应列中存在,详细介绍与具体使用如下所示:

        这个情况下,可以认为班级表约束了学生表,此时就把班级表这种约束别人的表,称为“父表”(parent table),把学生这种被别人约束的表,称为“子表”(child table),引入外键约束之后,每新增一条记录就会先在对应的父表中进行查询,看看是否存在,如果不存在就会报错。

        其实,外键约束也是一个双向约束,也就是父亲在约束孩子时,孩子也同时约束着父亲,这也就是所谓的言传身教,所以这里子表对父表也有约束的,要想删除父表中某条记录,就必须先删除子表中对应的数据,保证子表中没有数据引用父表这条记录,才能真正执行删除,下面进行演示,详细介绍与具体效果如下:

        在尝试删除或修改父表中的记录,也会先查询子表,看看当前这个结果是否在子表中被引用,如果被引用,就会删除失败。

        使用外键约束的时候,操作子表要查询父表,操作父表也要查询子表,这里就会伴随很多查询操作,如果表中数据非常多,查询操作就会非常低效,为了让上述查询更加高效,往往就需要要求子表中的列和父表中被引用的列,都要带有“索引”,索引可以理解成目录,关于索引的知识,在后续文章会介绍到,下面通过一个简单示例进一步介绍与演示:

二、表的设计

        谈到“数据库设计”,就是根据需求,来把需要的表创建出来(有几个表,每个表中有什么……),设计的一般过程如下:

  1. 先根据需求,找到实体(一些关键性质的对象)
  2. 梳理清楚实体之间的关系

        在梳理清楚需求后提出关键的名字,一般来说,每个实体都要安排一个表,多个实体之间,需要理清楚关系,不同关系下,有不同的设计表的方式,常见关系可分为四种,有一种关系是没有关系,这种就不进行介绍了,所以下面我会进行三种关系的介绍。

1.一对一

        这里我们以学校的教务系统为例,在教务系统中需要表示一个概念,学生(实体),还有一个概念是账号(实体),针对这两个概念可以分别创建两张表:

  1. 学生表:学号,姓名,班级,联系方式,入学时间……
  2. 账号表:账户名,密码,登录地点……

        这里的一对一关系可以这么理解:

一个学生只能有一个账号(学生不能注册小号)

一个账号只能给一个学生使用(一个账号不能多个学生一起使用)

         在一对一的关系下,表结构有以下几种设计方案:

  • 方案一:创建一个大表,把所以信息放在一起,当然,这种方案只适合于当两张表都很简单(列很少)可以考虑合并在一起,如果这两张表都比较复杂(列很多)那就不建议合并了。
  • 方案二:分成两张表,使用id引用过来,建立联系,例:

student(student_id,student_name,account_id);

account(account_id,user_name,password); 

2.一对多

        以教务系统为例,有一个实体学生,还有一个实体班级,同样针对这两个实体可以创建两张表,在这里,一对多的关系可以这么理解:

一个班级可以包含多个学生

一个学生只能属于一个班级

        针对一对多,设计表也存在两种方案:

  •  方案一:如下图,原理就是在班级表中使用一个数组类型字段把班级中学生的学号存在数组中,这样就知道班级中有哪些学生了,这里的问题就在于MySQL中并不支持“数组”这样的类型,所以这个方案这MySQL中行不通。
  • 方案二:如下图,原理就是在学生表中添加一个字段存储班级号,这样一个学生就只对应一个班级,而班级表也不需要存储学生的信息了。

3.多对多

        以教务系统为例,学生是一个实体,课程也是一个实体,同样针对这两个实体可以创建两张表,在这里,多对多的关系可以这么理解:

一个学生可以选择多门课程

一门课程可以被多个学生选择

        这里创建多对多关系时需要引入一个关联表,用于把两张表联系到一起,具体如下:

        通过关联表就可以知道某个同学都选择了哪些课程。

        在设计表时,我们就可以按上面的示例,确定每个实体的关系,然后往里面套,能套上哪个,就用哪种方式创建表。

·尾声

        文章到这里就接要结束了,本篇文章分为两个部分,分别是对约束的介绍,还有对表设计的介绍,对于约束这里我只是简单的介绍了约束的一些基础用法,但实际添加约束还有其他方式,约束的使用也还有很多方式,如果有机会,我会在后续文章继续进行补充,对于表的设计,这里谈到设计,往往是与“经验”有一定关联的,我在这只是对表设计的基础进行了简单的介绍,实际上,关于设计这是一个非常复杂的问题,这需要考虑的东西有很多,原谅博主能力有限只能介绍这么多,如果这篇文章对你有所帮助,希望能多多支持咯,您的支持就是我最大的动力~~~~

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

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

相关文章

Spring Boot 01:Spring Boot 项目的两种创建方式

一、前言 记录时间 [2024-05-25] 本文讲述 Spring Boot 项目的两种创建方式,分别是 IDEA 和官网。 由 Spring 官网知,当前 Spring Boot 的最新版本为 3.3.0,需要最低 JDK 版本为 17。 Spring 官网项目创建地址JDK 17 版本下载地址 准备工作…

软考-下午题-试题二、三

主要是最后一问的不同解答 1、父图子图平衡 1、员工关系是否存在传递依赖?用100字以内的文字说明理由。2019 2、在职员关系模式中,假设每个职员有多名家属成员,那么职员关系模式存在什么问题? 应如何解决?2020 职员关系…

二十八篇:嵌入式系统实战指南:案例研究与未来挑战

嵌入式系统实战指南:案例研究与未来挑战 1. 引言 1.1 嵌入式系统的重要性及其应用广度 在当今快速发展的技术领域中,嵌入式系统扮演着至关重要的角色。这些系统是专门设计的计算机硬件和软件的组合,旨在执行特定任务,如控制、监…

青鸟云报修系统:实现高效、便捷的维修申请处理

在日常生活和工作中,故障报修难免会遇到,售后报修服务则成为了解决问题的关键。纸质化售后报修维修申请单,作为报修流程中的重要一环,在一定程度上能够记录和追踪售后报修维修流程,但在实际操作过程中却存在着诸多弊端…

速看!!!24上软考-信息系统项目管理师真题回忆,考点已更新

整理了24上半年软考高级信息系统项目管理师的考试真题,软考一个批次一套题,现在都是机考,收集题目比较困难,希望能给个小小的赞支持一下。 注意:当天考试的宝子们可以对答案预估分数!后面场次的宝子可以提…

llama-factory学习个人记录

框架、模型、数据集准备 1.llama-factory部署 # 克隆仓库 git clone https://github.com/hiyouga/LLaMA-Factory.git # 创建虚拟环境 conda create --name llama_factory python3.10 # 激活虚拟环境 conda activate llama_factory # 安装依赖 cd LLaMA-Factory pip install -…

Java虚拟机揭秘-底层驱动力,性能保障!

Java虚拟机作为Java技术体系的核心组成部分,其重要性不言而喻。它不仅为Java提供了跨平台的能力,更是Java程序运行的基石。本文将为您深入解析Java虚拟机的工作原理、作用和应用场景,并通过生动的实例让您彻底理解这一关键技术。 一、Java虚拟…

element-plusDate Picker 日期选择器获取年月日

代码逻辑 对选择日期选择后进行搜索 : function dataValue(value) {console.log(value);scenic_list.value arrlist.value.filter(function (item) {// 判断是否满足搜索条件if (String(item.create_time).indexOf(String(value)) > -1) {return scenic_list}}…

SpringMVC流程

1、SpringMVC常用组件: DispatcherServlet(请求分发器):Spring MVC的核心组件之一,负责处理全局配置和将用户请求分发给其他组件进行处理。Controller(处理器): 实际处理业务逻辑的…

B站滑块登录之极验点选

滑块登录这些东西都不是很难,我个人的去处理的话一般会考虑三种方案,一个是自动化selenium 二是各类打码平台 三是ocr识别,本文是selenium接打码平台,也是个比较常规的操作。 先常规步骤跟着来吧,做登录的话把基本的模…

Tower在深度学习中的概念,tower没有确切定义

在论文UniTS中,来自Havard的工作。 tower更像是针对一个task的组件 tower这个概念貌似在REC(recommendation)推荐系统中使用较多 deep learning - What is a tower? - Data Science Stack Exchange https://developers.google.com/machin…

技术前沿 |【VL-BEIT:引领未来的极简单阶段多模态预训练方案】

VL-BEIT:引领未来的极简单阶段多模态预训练方案 引言一、VL-BEIT的基本介绍二、VL-BEIT的原理和工作方式三、VL-BEIT的特点四、VL-BEIT的应用场景五、总结与展望 引言 在人工智能蓬勃发展的今天,多模态预训练模型正逐渐成为研究和应用的热点。这些模型能…

二叉树OJ题目

一.二叉树第k层结点个数 有这样的一个思路:我既然要求第k层的结点个数,我肯定是要用到递归,那么当我在递归到第k层的时候我就开始判断,这一层是不是我所需要的那一层,如果是,就计数有几个节点,…

边框渐变样式

实现样式: 对应代码: div {min-height: 40vh;border: 10px solid transparent;background-image: linear-gradient(#222, #222), var(--gradient);background-origin: border-box;background-clip: padding-box, border-box;border-radius: 10px;positi…

粉丝问,有没有UI的统计页面,安排!

移动应用的数据统计页面具有以下几个重要作用: 监控业务指标:数据统计页面可以帮助用户监控关键业务指标和数据,例如用户活跃度、销售额、转化率等。通过实时更新和可视化呈现数据,用户可以及时了解业务的整体状况和趋势。分析用…

每日练习之字符串——得分

得分 题目描述 运行代码 #include <iostream> using namespace std; int main(){int n;cin>>n;while(n--){string s;cin>>s;int ls.length();int a0;int t1;for(int i0;i<l;i){if(s[i]O){at;t;}else if(s[i]X){t1;}}cout<<a<<endl;} } 代码…

QT7_视频知识点笔记_5_线程,数据库

多线程 两种办法&#xff1a;第一种&#xff1a;Qt4.7之前的线程使用的方法&#xff08;简单&#xff09;&#xff1b;第二种&#xff1a;Qt4.7之后的&#xff08;灵活–推荐&#xff09;----connect最后一个参数的作用&#xff1a;默认连接&#xff0c;队列连接&#xff0c;直…

操作系统总结4----死锁的处理策略总结

目录 2.4.2 死锁的处理策略-----预防死锁 &#xff08;1&#xff09;知识总览 &#xff08;2&#xff09;破环互斥条件 &#xff08;3&#xff09;破环不剥夺条件 &#xff08;4&#xff09;破环求情和保持条件 &#xff08;5&#xff09;破环循环等待条件 总结 2.4.3 死…

AI革命:生活无处不智能

AI革命&#xff1a;生活无处不智能 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0…

使用FFmpeg推流实现在B站24小时点歌直播

使用FFmpeg推流实现在B站24小时点歌直播 本文首发于个人博客 安装FFmpeg centos7 https://www.myfreax.com/how-to-install-ffmpeg-on-centos-7/ https://linuxize.com/post/how-to-install-ffmpeg-on-centos-7/ 使用FFmpeg在B站直播 https://zhuanlan.zhihu.com/p/2395…