MySQL:数据库的约束与表设计的简要理念

目录

    • 7. 数据库的约束
      • 7.1 NOT NULL
      • 7.2 UNIQUE
      • 7.3 DEFAULT
      • 7.4 PRIMARY KEY
      • 7.5 FOREIGN KEY
      • 7.6 CHECK
    • 8. 表的设计
      • 8.1 设计表的通用步骤
      • 8.2 实体之间的关系

7. 数据库的约束

约束可以理解成,数据库提供的一种针对数据的合法性验证的机制,数据库中经常会涉及大量的数据,也会涉及到大量的增删改查操作,如果数据库不提供这样的校验机制,就只能靠程序员手工来保证,基本认为是不靠谱的

7.1 NOT NULL

设定NOT NULL,说明列里不能存储空值,表里的内容就是必填项

7.2 UNIQUE

create table student (id int unique, name varchar(20) unique);

设定这一列的所有行的数据都得是唯一的(不能重复)

每次插入/修改,都要先触发查询,如果当前插入/修改,值已经存在,就会插入/修改失败

加上unique之后,执行效率就会降低,对数据的校验更严格了,有助于写代码的时候减少出错的概率,提高开发的效率

是否有办法,不删除重新建表,也能添加约束? — SQL有一个 alter table 操作,不仅能够修改约束,还能修改列名/类型/新增列/删除列… ,用法非常复杂,工作和面试也很少涉及

7.3 DEFAULT

create table student(id int, name varchar(20) default 'li');

指定默认值,不进行任何指定,默认值就是NULL,在指定列插入的时候,会用到

设置好了之后,后续进行指定列插入的时候,未被指定的列就会保持默认值

7.4 PRIMARY KEY

create table student(id int primary key, name varchar(20));

主键是一条记录的身份标识:NOT NULL + UNIQUE

比较两个东西,是否是同一个,就可以通过身份标识来进行区分

  • 不能为NULL

  • 不能重复

  • 一般给表设定主键,都是使用数字(整数形式),很少会使用字符串

  • 一个表只能有一个主键(怕出现二义性),一个主键不一定只针对一个列(联合主键:把多个列的内容联合到一起,共同构成一个主键,很少使用)

  • 当某个列集合了not null和unique就成为主键了

自增主键

create table student(id int primary key auto_increment, name varchar(20));
insert into student values (null, '张三');
insert into student values (null, '李四');
insert into student values (null, '王五');

每次插入新的数据,都可以把主键基于上一条数据的主键再+1,此时插入数据,主键的值就不必手动指定了,当然也可以手动指定,不一定非要依赖自增主键

规则是最大之上+1

自增主键,本质上是MySQL服务器存储了当前表中的最大ID,再进一步的进行累加的,基于分布式系统,存储数据的时候,MySQL自增主键就无能为力了,如果要存储的数据量非常大,一台机器存不下,就需要引入若干台机器了,每个机器存储一部分数据

在分布式系统中,如何生成唯一ID,具体的生成算法有很多种,此处给出一个最简单最朴素的方式,其他的生成算法核心思路大同小异

时间戳(ms) + 机器的编号 + 随机因子(随机数)

hash算法

md5,sha1本质上都是数学问题,套公式,把字符串每个字符代表的数字,代入公式,进行一系列计算得到hash值

相比于具体的算法,更关注特性,以md5为例:

  • 定长(校验和):无论输入的字符串多长,最终算出来的hash值都是一样长的
  • 分散(hash算法):输入的字符串,哪怕只有一点点不一样,得到的md5值都会差异很大
  • 不可逆(加密):给定hash值,还原成原始的字符串,理论上不可行

7.5 FOREIGN KEY

create table class (classId int primary key, className varchar(20));
create table student (id int primary key auto_increment, name varchar(20), classId int, foreign key(classId) references class(classId));

外键涉及到两个表的关系,和unique类似的效果,都要在插入/修改之前,进行查询

引用父表的这一列,要么是主键,要么是unique

此时,student的classId就和class表中的classId建立了联系,student classId中的值,必须要在class表的classId中存在,class表就对student表产生了制约,称class表为父表(parent table),student表为子表(child table)

一旦建立好外键约束,后续针对子表进行操作,就会频繁的涉及到在父表中针对被引用的列, 进行查询操作

数据库中,针对主键/unique,查询操作都是有额外的优化策略的,使这里的查询效率比较高,比遍历表要更高

7.6 CHECK

check指定条件,插入/修改数据,数据符合条件才能插入/修改成功,不符合条件,直接失败

MySQL 5.7 不支持check

比如某个表有一列性别 varchar(1)类型,通过check一个条件(gender = ‘男’ or gender = ‘女’)

考虑一个场景:电商网站

商品表(id,name,price....)//父表
订单表(orderId,...,goodId)//子表

如何将某一个商品下架

商品表(id,name,price....isOk)//父表 1表示有效数据,0表示无效数据

当我们要删除商品的时候,不是delete,而是把isOk改成0

后续用户查询商品列表的时候,也是通过条件,只返回isOk为1的记录

在硬盘上删除一个文件,其实也不是说把硬盘上的对应空间的数据给擦除,也是标记为无效,标记成无效之后,可能就被系统用来存储别的数据

8. 表的设计

此处只介绍基础的方法论

8.1 设计表的通用步骤

  • 理清楚需求场景中的“实体”(entry)有哪些
  • 理清楚实体之间的关系

8.2 实体之间的关系

1. 一对一

  • 一个学生只能有一个账号,一个账号只能属于一个学生
  • 设计方式:
    • 一张表:既包含学生的信息,又包含账号的信息
    • 两张表:
      • student (studentId,name,gender,classId…accountId)
      • account(accountId, username, password,loginTime…studentId)

2. 一对多

  • 一个班级可以包含多个学生,一个学生只能存在于一个班级
  • 设计方式:
    • 第一种:
      • 学生表(Id, name…)
      • 班级表(classId, className, studentList) 就像一个数组一样,存储了哪些学生的Id
    • 第二种:
      • 学生表(Id, name, classId)
      • 班级表(classId, className)

3. 多对多

  • 一个学生可以选择多个课程来学习,一个课程也可以被多个学生选择
  • 设计方式,引入关联表:
    • student(id, name…)
    • course(courseId, courseName)
    • student_course(studentId,courseId)
  • 关联表的数据是否要同时和原来的实体的数据表一起进行添加更新,要看实际场景

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

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

相关文章

JavaEE企业级分布式高级架构师课程

教程介绍 本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发…

深度学习pytorch——GPU加速(持续更新)

使用 .to(device),以前使用 .cuda() ,但是现在基本不使用了。 代码示例: 查看电脑GPU运行情况: 使用Ctrl Shift ESC快捷键:

24计算机考研调剂 | 广西科技大学

广西科技大学算机科学与技术专业接受调剂 考研调剂招生信息 学校:广西科技大学 专业:工学->计算机科学与技术 年级:2024 招生人数:10 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 我院 0812 计算机科学与技术专业接受调…

目标检测上的diffusion

1 Title DiffusionDet: Diffusion Model for Object Detection(Shoufa Chen,Peize Sun,Yibing Song,Ping Luo)【ICCV 2023】 2 Conclusion This study proposes DiffusionDet, a new framework that formulates object detection as a denoisin…

吴恩达2022机器学习专项课程(一) 3.3 成本函数的公式

问题预览 模型的参数(w和b)有什么作用?不同的w和b对线性回归模型有什么影响?训练集里的y和线性回归模型预测的y(y帽)的区别是什么?成本函数的作用是什么?成本函数的公式是什么&…

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(六)—— 二元分类

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战演绎 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 这篇文章咱们将深度学习应用到另一个常见任务…

【C语言题解】编写题解 1681: 数据结构-行编辑程序

原题链接数据结构-行编辑程序 - C语言网 (dotcpp.com) #include <stdio.h> #include <malloc.h> #define Elemetype char typedef struct SNode{int Data[1000];int Top; }*Stack,SNode; void Push (Stack,Elemetype); int Pop(Stack,Elemetype*); int TopStack(S…

STM32学习笔记(6_1)- TIM定时器定时功能原理

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

(ES6)前端八股文修炼Day2

1. let const var 的区别 var&#xff1a; var 是在 ES5 中引入的声明变量的关键字。 具有函数作用域&#xff0c;而不是块作用域&#xff0c;这意味着使用 var 声明的变量在函数内部是可见的。 变量可以被重复声明&#xff0c;而且变量的值可以在声明前使用&#xff0c;这可能…

jmeter链路压测

比如登录后返回token&#xff0c;业务打印上传的操作需要用到token 线程组中添加登录请求&#xff0c;并执行 1、添加登录并执行&#xff0c;查看结果 2、结果树中下拉选择正则表达式&#xff0c;将token参数和值复制粘贴到下方&#xff0c;将token值改为(.*?)&#xff0…

【Nebula笔记】简介及安装

目录 一、简介 (一) 什么是图数据库 二、安装 (一) 原生安装 (二) Docker & Docker compose 1. Docker安装 Linux Window 2. 部署NebulaGraph (三) to MAC 三、Nebula Graph Studio (一) 版本兼容性 (二) 原生安装 (三) Docker compose (四) 连接Nebula Gra…

python—接口编写部分

最近准备整理一下之前学过的前端小程序知识笔记&#xff0c;形成合集。顺便准备学一学接口部分&#xff0c;希望自己能成为一个全栈嘿嘿。建议关注收藏&#xff0c;持续更新技术文档。 目录 前端知识技能树http请求浏览器缓存 后端知识技能树python_api&#xff1a;flaskflask…

MySQL数据库(基础篇二)

一、简单查询 1.1 数据的备份还原 导出&#xff1a;先对数据库进行备份&#xff0c;然后提取备份文件中的sql语句导入&#xff1a; 方法一&#xff1a;创建和原始数据同名的数据&#xff0c;然后执行从备份文件中导出的sql语句【此方法不要修改sql语句】方法二&#xff1a;在数…

Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(四)

概览 从上一篇博文: Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(三)我们学到了 Swift 中完全自己撸码实现 SwiftHook 类似功能的基本思路、提出了两个“难关”,并首先解决了其中第一道难题。 在这一篇中,我们将会继续克服各种“艰难险阻”,…

Spark spark-submit 提交应用程序

Spark spark-submit 提交应用程序 Spark支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式&#xff0c;易于构建集群。Apache Mesos—通用的集群管理&#xff0c;可以在其上运行Hadoop MapReduce和一些服务应用。Hadoop YARN—Hadoop2中的资源管理器。 注意&…

STM32微控制器的中断优先级设置对系统性能有何影响?

STM32微控制器的中断优先级设置对系统性能有着显著的影响。正确配置中断优先级可以确保关键任务得到及时响应&#xff0c;提高系统的实时性和可靠性。相反&#xff0c;如果中断优先级设置不当&#xff0c;可能会导致系统响应延迟&#xff0c;甚至出现死锁等问题。本文将详细探讨…

python第三方库的安装,卸载和更新,以及在cmd下pip install安装的包在pycharm不可用问题的解决

目录 第三方库pip安装&#xff0c;卸载更新 1.安装&#xff1a; 2.卸载 3.更新 一、第三方库pip安装&#xff0c;卸载更新 1.安装 pip install 模块名 加镜像下载&#xff1a;pip install -i 镜像网址模块名 常用的是加清华镜像&#xff0c;如 pip install -i https://pyp…

Web前端—浏览器渲染原理

浏览器渲染原理 浏览器渲染原理渲染时间点渲染流水线1. 解析HTML—Parse HTML2. 样式计算—Recalculate Style3. 布局—Layout4. 分层—Layer5. 绘制—Paint6. 分块—Tiling7. 光栅化—Raster8. 画—Draw完整过程 面试题1. 浏览器是如何渲染页面的&#xff1f;2. 什么是 reflow…

Golang获取音视频时长信息

文章目录 一、工具简介二、使用golang获取时间长 一、工具简介 这些工具都是与多媒体处理和流媒体相关的开源工具&#xff0c;它们都属于 FFmpeg 多媒体框架。 FFmpeg 是一个用于处理多媒体内容&#xff08;音频、视频、图像等&#xff09;的命令行工具。它可以执行各种各样…

每日一题 --- 两两交换链表中的节点[力扣][Go]

两两交换链表中的节点 题目&#xff1a;24. 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&a…