当前位置: 首页 > article >正文

关系型数据库设计基础:约束、三大范式、表关系与表设计流程

文章目录一: 数据库约束1. 什么是数据库约束2. 常见约束类型(1) NOT NULL非空约束(2) UNIQUE唯一约束(3) DEFAULT默认约束(4) PRIMARY KEY主键约束(5) FOREIGN KEY外键约束(6) CHECK检查约束二: 表关系1. 一对一2. 一对多1 : N3. 多对多M : N4. 关系总结三: 关系型数据库三大范式第一范式1NF列不可再分第二范式2NF消除部分依赖第三范式3NF消除传递依赖四: 实际表设计流程文章作者:当战神遇到编程文章专栏:MySQL欢迎大家点赞评论收藏⭐文章一: 数据库约束1. 什么是数据库约束数据库约束是对表中数据进行限制的规则用于保证数据的正确性、完整性、一致性。简单理解防止插入错误数据。2. 常见约束类型约束名作用NOT NULL字段不能为空UNIQUE字段值唯一不能重复PRIMARY KEY主键唯一且不能为空FOREIGN KEY外键保证关联关系DEFAULT默认值CHECK检查数据是否满足条件(1) NOT NULL非空约束某列必须有值。nameVARCHAR(10)NOTNULL例如用户名不能为空。(2) UNIQUE唯一约束该列数据不能重复但可以有一个或多个 NULL不同数据库略有区别。phoneVARCHAR(20)UNIQUE例如手机号不能重复。(3) DEFAULT默认约束插入数据时若未赋值则使用默认值。genderVARCHAR(2)DEFAULT男(4) PRIMARY KEY主键约束这一行/这一条记录的身份标识idINTPRIMARYKEY特点主键的值在表中是唯一的不能为空:主键字段的值必须有内容,不能是空白或NULL只能定义一个主键主键可以是单列也可以是多列组合复合主键。-- 复合主键例子-- 规则 只有当 name 和 class 同时相同时才会被判定为重复。CREATETABLEstudent(nameVARCHAR(10),classVARCHAR(20),PRIMARYKEY(name,class));当主键为整数类型时通常建议开启 AUTO_INCREMENT自增属性让数据库自动维护主键值避免手动维护的麻烦。CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(10),classVARCHAR(20));主键值交给数据库自动分配插入时可以直接写 NULL无需手动指定INSERTINTOstudentVALUES(NULL,张三,1);核心原理与特点1.数据库内部维护了一个计数器默认情况下新值 上一次分配的值 1。2.自增主键在开发中,特别常用,但对于分布式场景无法应对(5) FOREIGN KEY外键约束用于建立父表主表与子表从表之间的引用关系保证数据的参照完整性避免出现无效的 “孤儿数据”。补充说明父表中被关联的列必须带有索引主键自带索引因此外键通常引用父表的主键。-- 1. 切换数据库USEjava118;-- 2. 创建父表班级表CREATETABLEclass(class_idINTPRIMARYKEYAUTO_INCREMENT,class_nameVARCHAR(10));-- 插入班级数据INSERTINTOclassVALUES(NULL,java110),(NULL,java111),(NULL,java112);-- 3. 创建子表学生表class_id 列设置外键引用 class 表的 class_idCREATETABLEstudent(student_idINTPRIMARYKEYAUTO_INCREMENT,student_nameVARCHAR(10),class_idINT,FOREIGNKEY(class_id)REFERENCESclass(class_id));-- 插入学生数据外键值必须在父表中存在INSERTINTOstudentVALUES(NULL,张三,1),(NULL,李四,2),(NULL,王五,3);外键的核心约束规则子表约束插入 / 修改限制如果父表中不存在对应的外键值子表无法插入或修改该外键列。例如不能给学生插入一个不存在的班级 ID如 class_id99。父表约束删除 / 修改限制:如果父表中的数据正被子表引用则该条数据无法直接删除或修改。例如不能直接删除还有学生关联的班级否则会导致学生的 class_id 变成无效数据。补充说明查看外键约束查看子表结构时Key 列若显示为MUL就代表该列设置了外键约束外键实战电商项目中的「逻辑删除」方案在电商等实际项目中外键的 “父表删除限制” 会带来一个典型矛盾我们通常用逻辑删除来解决。1.业务矛盾外键约束 vs 商品下架业务场景商家想把 “衬衫” 下架相当于删除商品但订单表中已经有大量该商品的历史订单。矛盾点外键约束会禁止直接删除商品否则订单表中的商品 ID 会变成无效数据导致历史订单混乱。2. 解决方案逻辑删除核心原理不真正物理删除数据而是通过一个标记位Flag来表示该数据的 “有效 / 失效” 状态让数据 “假死” 而非消失。实现步骤(1) 给父表增加标记列在商品表中新增一个状态字段例如 isOk○ 1 表示商品有效上架状态○ 0 表示商品失效下架状态(2) 下架操作改为更新标记位不再执行 DELETE 删除语句而是用 UPDATE 把标记位改成 0-- 把商品id1的商品标记为下架UPDATE商品表SETisOk0WHERE商品id1;(3) 用户查询过滤失效数据查询商品列表时只返回标记为有效的数据用户感知不到 “已下架商品” 的存在-- 只给用户展示未下架的商品SELECT*FROM商品表WHEREisOk1;3.逻辑删除的核心优势保留历史数据已下架商品的历史订单记录依然完整可查不会出现数据断裂。数据安全可恢复误操作下架后只需把 isOk 改回 1 即可恢复商品无需复杂的数据恢复流程。兼容外键约束无需删除数据自然避开了外键对父表删除的限制同时依然保证了数据的参照完整性。(6) CHECK检查约束限制字段取值范围。例如年龄不能小于6。CREATETABLEstudent(ageINTCHECK(age6),nameVARCHAR(20));二: 表关系表与表之间常见有 四种关系类型一对一1 : 1一对多1 : N多对多M : N没关系1. 一对一含义一张表中的一条记录只对应另一张表中的一条记录。示例用户表 与 用户详情表user用户表idusername1张三user_info详情表user_id身份证号地址1xxx北京说明一个用户只有一份详情一份详情只属于一个用户一对一 (1:1) 实现代码核心要点 在从表的外键上添加 UNIQUE 约束确保一个主表记录只能被引用一次。-- 1. 创建用户主表CREATETABLEuser(idINTPRIMARYKEYAUTO_INCREMENT,usernameVARCHAR(20));-- 2. 创建用户详情表CREATETABLEuser_info(-- user_id 既是外键也必须是唯一的从而实现 1:1user_idINTUNIQUE,id_cardVARCHAR(18),addressVARCHAR(100),-- 建立外键关联FOREIGNKEY(user_id)REFERENCESuser(id));2. 一对多1 : N含义一张表中的一条记录对应另一张表中的多条记录。示例学院表 与 学生表college学院表id学院名1计算机学院student学生表id姓名college_id1001张三11002李四1说明一个学院有多个学生一个学生只属于一个学院一对多 (1:N) 实现代码核心要点 外键直接建立在“多”的一方学生表即可不需要加 UNIQUE。-- 1. 创建学院表 (一)CREATETABLEcollege(idINTPRIMARYKEYAUTO_INCREMENT,college_nameVARCHAR(20));-- 2. 创建学生表 (多)CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENT,student_nameVARCHAR(10),college_idINT,-- 外键列-- 多个学生可以关联同一个学院IDFOREIGNKEY(college_id)REFERENCEScollege(id));3. 多对多M : N含义两张表中的多条记录彼此对应多条记录。示例学生表 与 课程表一个学生可选多门课一门课可被多个学生选studentid姓名courseid课程名student_course中间表student_idcourse_id1001C011001C021002C01多对多 (M:N) 实现代码核心要点 必须创建一个独立的中间表用来存放两个表的主键关联。-- 1. 创建学生表CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENT,nameVARCHAR(10));-- 2. 创建课程表CREATETABLEcourse(idVARCHAR(10)PRIMARYKEY,course_nameVARCHAR(20));-- 3. 创建中间表 (选课表)CREATETABLEstudent_course(student_idINT,course_idVARCHAR(10),-- 建议将两个外键设为联合主键防止同一个学生重复选同一门课PRIMARYKEY(student_id,course_id),-- 分别建立外键关联FOREIGNKEY(student_id)REFERENCESstudent(id),FOREIGNKEY(course_id)REFERENCEScourse(id));4. 关系总结关系类型举例实现方式一对一用户-详情外键 唯一约束一对多学院-学生多方加外键多对多学生-课程建中间表三: 关系型数据库三大范式第一范式1NF列不可再分核心要求字段必须具有原子性不可再分每一列只能存一个值不能存多个值。不满足第一范式的例子学号姓名班级名学校信息101张三Java一班清华大学, 北京市海淀区, 010-8888满足第一范式的例子合格的表学号姓名班级名学校名称学校地址学校电话101张三Java一班清华大学北京市海淀区010-8888注意:数据库的“入场券” 第一范式是关系型数据库的最基本要求。如果不满足 1NF则不能被称为真正的关系型数据库。原子性的标准 原子性不是绝对的而是根据业务需求决定的。○ 例如 如果业务只需要显示全名那么 姓名 就是原子的但如果业务需要区分“姓”和“名”那么 姓名 就得拆分为 姓 和 名 两列。第二范式2NF消除部分依赖核心定义在满足第一范式1NF的基础上消除非主键字段对候选键的“部分函数依赖”。1.必须要懂的底层概念 (术语拆解)候选键 (Candidate Key) vs 主键 (Primary Key)○候选键 表中能唯一标识一行数据的列或列组合。○主键 从候选键中选出来的“正职”班长。○联合主键 由多个列共同组成的唯一主键。此时单独的每一列只能叫“候选键”合在一起才叫“主键”。函数依赖○完全函数依赖 必须通过整个主键才能确定某个数据。(2NF要求)○部分函数依赖 只通过主键中的一部分列就能确定某个数据。 ( 2NF禁止)2.案例剖析这张表中使用学号课程名定义联合主键来唯一标识一个学生某门课程的成绩这张表中学生姓名只依赖于学号,不依赖于课程名,学分只依赖于课程名,不依赖于学号,这两个非关键字段都不满足第二范式的核心定义改正:拆成三个表学生表Id学号学生姓名年龄性别110001张三18男210002李四19女310003王五18男课程表Id课程名学分1MySQL502Java603C60成绩表学生Id课程Id成绩11982110031891210022993398只有单列主键的表通常天然满足第二范式。如果表没有满足第二范式可能出现的问题有1.数据冗余学生的姓名年龄学分都重复的出现造成大量的数据冗余2.更新异常假设需要调整MySQL的学分就需要修改所有记录中关于MySQL的记录.如果部分记录更新失败就会出现同一课程学分不一致的情况表现为数据不一致3.插入异常⽬前这样的设计成绩与每⼀⻔课和学⽣都有对应关系也就是说只有学⽣参加选修课程考试取得了成绩才能⽣成⼀条记录。当有⼀⻔新课还没有学⽣参加考试取得成绩之前那么这⻔新课在数据库中是不存在的因为成绩为空时记录没有意义。4.删除异常把毕业学⽣的考试数据全都删除此时课程和学分的信息也会被删除掉有可能导致⼀段时间内数据库⾥没有某⻔课程和学分的信息。第三范式3NF消除传递依赖定义在满⾜第⼆范式的基础上消除非主键字段对非主键字段的依赖消除传递依赖。一、先理解什么叫传递依赖如果存在主键-A-B说明A 依赖主键B 又依赖 A那么 B 就是间接依赖主键这叫传递依赖。举个例子:学号姓名年龄所属学院学院地址学院电话存在传递依赖学号- 所在学院- 学院电话,存在传递依赖的表不满足第三范式。改正只需要拆分成两张表。1.学院表学院编号学院名学院电话学院地址2.学生表学号姓名年龄学院编号这样设计后两张表中的非主键字段都直接依赖各自主键学生表通过外键学院编号与学院表建立关联关系。四: 实际表设计流程1. 需求分析明确存什么理清业务搞清楚系统有哪些实体如用户、商品、订单以及它们之间的关系。确定字段列出每个实体需要记录的信息如用户有姓名、手机号、注册时间。2. 概念设计画 E-R 图识别关系确定实体间是一对一1:1、一对多1:N还是多对多N:N。绘图使用 E-R 图实体-联系图可视化表达防止漏掉关键关联。3.逻辑设计定表结构表转换将实体转为表字段转为列。数据类型为每个字段选择合适的类型如数字用 INT短文本用 VARCHAR时间用 DATETIME。主键设计每张表必须有一个唯一标识通常是自增 ID 或 UUID。4. 范式约束减少冗余遵循三范式3NF○1NF字段不可再分原子性。○2NF非主键字段必须完全依赖主键消除部分依赖。○3NF非主键字段不能相互依赖消除传递依赖如表里存了部门ID就不应再存部门名称。注有时为了性能会适当“反范式”冗余少量字段减少连表。5. 物理优化提升性能索引设计给高频查询的字段如 username、order_sn建立索引。约束设置设置 NOT NULL非空、DEFAULT默认值、UNIQUE唯一。存储引擎选择合适的引擎如 MySQL 默认的 InnoDB。6. 评审与落地产出 SQL设计评审与开发团队核对是否满足业务需求。编写 DDL编写 CREATE TABLE 语句并执行。维护文档更新数据库字典方便后期维护。

相关文章:

关系型数据库设计基础:约束、三大范式、表关系与表设计流程

文章目录一: 数据库约束1. 什么是数据库约束2. 常见约束类型(1) NOT NULL(非空约束)(2) UNIQUE(唯一约束)(3) DEFAULT(默认约束)(4) PRIMARY KEY(主键约束)(5) FOREIGN KEY&#xff…...

RimSort:让RimWorld模组管理变得如此简单!告别冲突,享受流畅游戏体验

RimSort:让RimWorld模组管理变得如此简单!告别冲突,享受流畅游戏体验 【免费下载链接】RimSort RimSort is an open source mod manager for the video game RimWorld. There is support for Linux, Mac, and Windows, built from the ground…...

百度百舸 开源全模态训练框架 LoongForge:一套代码跑通 GPU 与昆仑芯,多模态训练提速 45%

Idea 是廉价的,能被快速验证的 Idea 才值钱 OpenAI 核心基础设施构建者翁家翌当模型开始同时理解图像、视频乃至物理世界,并逐步具备行动能力时,一个问题也随之变得不可回避:我们是否仍在用 LLM 时代的基础设施,来训练…...

【后端开发】(图解/真实场景)自增ID、UUID、雪花算法,业务主键到底该怎么选?

文章目录前言1 先说清楚:主键 ID 和业务编号别混着用2 自增 ID:简单好用,但不要无脑用3 UUID:全局唯一,但不一定适合当数据库主键4 雪花算法:更适合分布式业务主键,但也有坑写在文后&#x1f52…...

提取字符串的子串

下面的内容摘录自《用R探索医药数据科学》专栏文章的部分内容(原文5050字)。 2篇2章13节:R语言中Stringr扩展包进行字符串的查阅、大小转换和排序_r语言stringi包-CSDN博客 R语言是数据科学和统计分析的强大工具,尤其在处理字符串…...

windows下通过WSL2部署Hermes AI助手全攻略

1.安装 打开ubuntu,下面运行指令都在这里操作 curl -fsSL -o install.sh https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh 上面步骤没有报错可以继续进行,如出现网络问题可切换网络重试上面步骤,重试…...

Qwen3-TTS-Tokenizer-12Hz智能配音系统:视频口型同步优化指南

Qwen3-TTS-Tokenizer-12Hz智能配音系统:视频口型同步优化指南 1. 引言 你有没有遇到过这样的情况:看视频时,人物的口型和声音对不上,那种违和感让人瞬间出戏?特别是在影视剧配音和虚拟主播场景中,音画不同…...

【2026】零基础小白如何入门CTF,看这一篇就够了(附学习笔记、靶场、工具包)

CTF收藏这一篇就够了 CTF简介:一、CTF入门1.1、CTF常识1.2、CTF竞赛模式 二、CTF赛事发布网站三、CTF在线靶场四、漏洞靶场五、CTF工具包六、学习路线 CTF简介: CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领…...

零基础在长沙学AI漫剧哪里可以学

要是零基础学好 AI 漫剧,这些核心工具一定要用对、跑通流程、先模仿再创作,按 “3 天入门→1 周熟练→1 个月独立出片” 的节奏推进,全程免费工具就能落地。下面长沙#好课优选#从学习路径、工具清单、完整流程、避坑要点四方面讲清楚。 第 1 …...

Wan2.2-I2V-A14B合规实践:符合《生成式AI服务管理暂行办法》私有部署

Wan2.2-I2V-A14B合规实践:符合《生成式AI服务管理暂行办法》私有部署 1. 镜像概述与合规背景 Wan2.2-I2V-A14B私有部署镜像是一款专为文生视频模型设计的合规解决方案,严格遵循相关法规要求。该镜像基于RTX 4090D 24GB显存算力环境深度优化&#xff0c…...

深度解析VinXiangQi:3种实战方法掌握AI象棋连线核心技术

深度解析VinXiangQi:3种实战方法掌握AI象棋连线核心技术 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi VinXiangQi是一款基于YOLOv5深度学习技…...

互联网大厂 Java 求职面试:音视频与微服务的技术挑战

互联网大厂 Java 求职面试:从音视频场景到微服务架构的技术挑战在一次互联网大厂的求职面试中,面试官和搞笑的水货程序员燕双非展开了一场激烈的技术讨论,以下是他们的对话。第一轮提问场景:音视频应用 面试官:燕双非&…...

互联网大厂 Java 面试:技术提问与幽默回答

互联网大厂 Java 面试:技术提问与幽默回答 在某个阳光明媚的上午,程序员燕双非走进了一家互联网大厂的面试现场,面试官是一位严谨的技术专家,准备对燕双非进行一轮考核。第一轮提问 面试官:燕先生,首先请您…...

ASM开源库实现函数耗时插桩

文章目录一、ASM简介1. 设计框架2. 设计模式:访问者模式和责任链模式3. visitor访问顺序二、ASM插桩常见用途1. 性能监控优化2. 自动化埋点与数据采集(无痕埋点)3. 热修复与功能动态化4. 隐私合规与安全改造三、ASM实现函数耗时统计1. AGP环境…...

Vite打包压缩插件vite-plugin-pack-orchestrator,自动搞定压缩、校验、自动哈希命名

📦 Vite 构建压缩插件:vite-plugin-pack-orchestrator 🤔 为什么又造一个轮子? 市面上已经有一些 Vite 打包插件,比如 vite-plugin-zip-pack、vite-plugin-compress 等,能用,但总差那么点意思…...

互联网大厂 Java 求职者面试:从 Spring Boot 到微服务的挑战

互联网大厂 Java 求职者面试:从 Spring Boot 到微服务的挑战 在互联网大厂的面试中,技术栈的广度和深度常常是决定求职者能否成功的关键因素。本文通过一位候选人燕双非的面试经历,展示了在面试过程中如何应对技术问题,以及面试官…...

医疗影像AI分割技术:VISTA-3D模型解析与应用实践

1. 医疗影像分割的现状与挑战 全球每年进行超过3亿次CT扫描,仅美国就占8500万次。放射科医生每天需要处理海量影像数据,传统的人工标注方式效率低下且容易出错。以肝脏肿瘤分割为例,经验丰富的放射科医生完成一例标注平均需要15-20分钟&#…...

DS4Windows终极指南:3步让PlayStation手柄在Windows电脑上完美运行

DS4Windows终极指南:3步让PlayStation手柄在Windows电脑上完美运行 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 还在为PC游戏无法识别你的PlayStation手柄而烦恼吗&#xf…...

解锁NVIDIA Profile Inspector全球影响力:多语言本地化架构深度解析

解锁NVIDIA Profile Inspector全球影响力:多语言本地化架构深度解析 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 掌握显卡配置工具国际化,让全球玩家享受专业级图形优化体验 …...

Cursor 变慢怎么办?2026排查指南

前言 如果你最近明显感觉 Cursor 变慢(AI 回复卡住、打字延迟、界面顿一下、启动变久),你不是个例。 2026 年 3-4 月,官方论坛、Reddit、X 上都有大量相似反馈。 这篇不讲玄学调参,只做一件事: 把最常见根因…...

Intv_ai_mk11 操作系统原理问答助手:深入解析进程、线程与内存管理

Intv_ai_mk11 操作系统原理问答助手:深入解析进程、线程与内存管理 1. 计算机教学的新助手 计算机专业的学生们常常面临一个共同挑战:操作系统原理这门课既抽象又复杂。从进程调度算法到内存管理机制,从死锁条件到分页策略,每个…...

为什么 Claude Code 没有一句废话?扒光它的底层提示词,我悟了!

往期热门文章: 1、面试官尬笑:你说半天就能读完一个开源项目源码,不就是用 AI 吗?我说:是用 DeepWiki,而且是 Codemap 模式! 2、Claude Code、Cursor 和 Codex,到底选哪个&#xff1…...

SOCD Cleaner:如何用开源工具解决游戏输入冲突,实现亚毫秒级响应

SOCD Cleaner:如何用开源工具解决游戏输入冲突,实现亚毫秒级响应 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的格斗游戏中,因为同时按下左右方向键而无法精…...

2026前端人必须知道的6个MCP服务器,每一个都能省掉一个工具链

你现在用AI的方式,可能还停留在"粘贴问题 → 复制答案 → 手动执行"的循环里。而MCP出现之后,这个循环正在被彻底打破。前几天有个同事问我:"你最近工作流变化大吗?"我想了想说:变化不大&#xff…...

SOCD Cleaner终极指南:彻底解决键盘输入冲突,提升游戏操作精度

SOCD Cleaner终极指南:彻底解决键盘输入冲突,提升游戏操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否在玩格斗游戏时,因为同时按下W和S键导致角色动作卡顿&am…...

第三届“长城杯”网数智安全大赛(防护赛)总决赛即将开启

4月28日,由中央网络安全和信息化委员会办公室、教育部、国家市场监督管理总局、国家数据局指导,中国信息安全测评中心、中国电信集团有限公司、中国移动通信集团有限公司、中国联合网络通信集团有限公司、北京师范大学联合主办的第三届“长城杯”网数智安…...

Zotero重复文献清理终极指南:5分钟批量合并重复条目的完整教程

Zotero重复文献清理终极指南:5分钟批量合并重复条目的完整教程 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为Zotero文献库…...

Hitboxer终极指南:如何用智能按键映射解决游戏操作冲突问题

Hitboxer终极指南:如何用智能按键映射解决游戏操作冲突问题 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中,明明想向左移动却向右走?或者同时按下…...

人类思想史上的一些思维模型整理

LLM 本质上是在做条件概率的接龙:根据你已经写下的每一个 token,去推断下一个最可能的分布。 你用的词、句式、段落节奏、甚至隐含的思维路径,都在不断收窄模型的“接下来该怎么说”的可能性空间。 所以,和 AI 对话时,…...

IPATool 实战指南:解锁App Store应用下载的3种创新用法

IPATool 实战指南:解锁App Store应用下载的3种创新用法 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trending/ip/ipato…...