【MySQL】三大范式

【MySQL】三大范式

下面我们来聊聊表的设计,如何设计一张比较合理,冗余性低且IO次数比较少,效率高的表。

我们需要先认识一下范式

什么是范式?

范式是⼀组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。
范式有哪些?

关系数据库有六种范式:第⼀范式(1NF)、第⼆范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,⼜称完美范式),越高的范式数据库冗余越小。然而,普遍认为范式越高虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙,因此在实际应用中,数据库设计通常只需满足第三范式即可,如果在想提高效率,再去增加某个字段的冗余性

为啥越高的范式数据库冗余越小,IO效率越忙呢?继续看


第一范式

第一范式即:数据库表的每⼀列都是不可分割的原子数据项,而不能是集合,数组,对象等非原子数据
在关系型数据库的设计中,满足第⼀范式是对关系模式的基本要求。不满足第⼀范式的数据库就不能被称为关系数据库。

所以,在关系型数据库中,每⼀列都可以用基本数据类型表示,就天然满足第⼀范式。

不是第一范式的例子:

其中学校这一列是一个对象,还可以在分割,不满足第一范式。

上述例子,如果满足第一范式:


第二范式

前提:表必须先满足第一范式(1NF)(即列不可再分,每一列都是原子值),且表的主键是复合主键(由多个字段共同构成)。

核心要求:所有非主键字段必须完全依赖于整个复合主键,而不能只依赖于复合主键中的某一个或某几个字段(即杜绝 “部分函数依赖”)。

如何理解?举个例子:

需求:学生可以选修课程,课程有对应的学分,学生考试后每门课程会产生相应的成绩

学生是通过学号来确定的,学⽣的姓名、年龄和性别和课程没有关系,即学生的信息只依赖学号,

不依赖课程名;学分是通过课程来确定的,课程的学分与学生没有关系,即学分只依赖课程名,不依赖学号

而这张表中使⽤学号+课程名定义复合主键来唯⼀标识⼀个学⽣某门课程的成绩,这也是这张表的主要作用。

所以这张表的某些列不依赖与复合主键的所有列,而只和其中一个或几个复合主键列有关系,那么就是部分依赖,就不满足第二范式。

即对于使用复合主键的表,如果一行数据中的有些列只与复合主键中的⼀个或其中几个列有关系,那么就说他存在部分函数依赖,也就不满足第⼆范式

反过来说,如果所有列都和复合主键的所有列有关,就满足第二范式。

所以根据上述需求,如果满足第二范式,需要将上述例子拆为3张表

第⼆范式强调的是部分函数依赖,当⼀张表中的主键只有⼀列时,天然满足第二范式

不满足第二范式的问题:

1.数据冗余
        学生的姓名、年龄、性别和课程的学分在每行记录中重复出现,造成了大量的数据冗余
2.更新异常
        如果要调整MySQL的学分,那么就需要更新表中所有关于MySQL的记录,⼀旦执行中断导致某些记录更新成功,某些数据更新失败,就会造成表中同一门课程出现不同学分的情况,出现数据不一致问题。
3.插入异常

        目前这样的设计,成绩与每一门课和学生都有对应关系,也就是说只有学生参加选修课程考试取得了成绩才能生成⼀条记录。当有⼀门新课还没有学生参加考试取得成绩之前,那么这门新课在数据库中是不存在的,因为成绩为空时记录没有意义
4.删除异常
        把毕业学生的考试数据全都删除,此时课程和学分的信息也会被删除掉,有可能导致⼀段时间内,数据库里没有某门课程和学分的信息


第三范式

在满足第二范式的基础上,不存在非关键字段,对任⼀候选键的传递依赖
如何理解?举个例子:

要求学生表中记录学生所属的学院,在满足第⼆范式的基础上对学生表做出修改

因为是要描述学生信息,并且在表中定义了Id为主键,Id可以明确的标识每条学生信息。

在这个表结构中,可以看出学生的学号、姓名、年龄、性别与主键Id强相关;学院电话、学院地址

与学院强相关;在⼀个表中出现了两个强相关的关系,而且这两个强相关关系又存在传递现象,即

通过学生Id可以找到学生记录,学生记录中包含学院名,每个学院⼜有自已的电话和地址

这种传递现象称为传递依赖,所以当前的表不满足第三范式
把上述例子改为满足第三范式:

把学院信息拆分出来定义学院表,学生表与学院表做关联

-- 精准查询指定学号学生的学院信息 SELECT s.student_id AS 学生学号, s.name AS 学生姓名, c.college_name AS 学院名称, c.phone AS 学院电话, FROM Student s INNER JOIN College c ON s.college_id = c.college_id -- 条件:指定要查询的学生学号 WHERE s.student_id = '10001';

在实际业务中,往往是先设计为第三范式,然后为了提高效率,通过反范式编程,即增加某个字段的冗余性,减少表的连接查询,来减少IO次数以提高效率。

如图:

如果使用反范式:

sql:

-- 精准查询指定学号学生的学院信息 SELECT c.college_name AS 学院名称, c.phone AS 学院电话, FROM Student s WHERE s.student_id = '10001';

Read more

AI设计代替UI的工具选择,有免费的使用额度!

AI直接生成UI 设计文件(Figma、Pixso、即时设计等格式)的工具已经很成熟了,作为一个没有ui设计的公司,用这些个工具就非常你测了,以下是主流且实用的选择,按国内 / 国外分类整理: 一、国内主流工具 1. Pixso AI(推荐) * 官网:https://ai.pixso.cn/ * 核心能力:输入文字描述,一键生成可编辑矢量 UI 设计稿,支持转为 Pixso 源文件,可导出 Figma 格式。 * 优势:中文语境优化好,内置 Ant Design、Material 等大厂组件库,生成后可直接编辑、协作,还能导出前端代码。 * 使用:注册后进入 AI 生成,输入需求(如 “设计极简风电商

By Ne0inhk

人工智能(AI)常见面试题及答案汇总(2025最新版)

一、AI基础概念与核心原理 1. 人工智能、机器学习、深度学习的关系? 答案: 三者是包含与被包含的关系,核心聚焦“让机器具备智能”的不同实现层次: * 人工智能(AI):广义是让机器模拟人类智能(如推理、学习、决策)的技术总称,涵盖机器学习、深度学习、专家系统、强化学习等多个分支,目标是解决“智能行为”问题; * 机器学习(ML):AI的核心分支,是实现AI的一种手段,指机器通过数据学习规律(无需显式编程),并利用规律预测或决策。核心是“从数据中自动学习模型”,不依赖手动设计规则(如传统编程); * 深度学习(DL):机器学习的子集,以深度神经网络(DNN) 为核心,通过多层网络结构自动提取数据的层级特征(从底层像素/字符到高层语义),擅长处理海量高维数据(如图像、语音、文本)。 关系图示:

By Ne0inhk
A / B测试太慢?AI帮你实时优化实验策略

A / B测试太慢?AI帮你实时优化实验策略

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕AI这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * A/B测试太慢?AI帮你实时优化实验策略 🚀 * 为什么传统A/B测试成了效率黑洞? * AI驱动的实时优化:从“被动等待”到“主动决策” * 贝叶斯优化:AI决策的数学引擎 * 代理模型:预测点击率 * 采集函数:决定下一步策略 * 代码实战:用Python实现AI优化A/B测试 * 代码执行结果示例 * 实时决策流程:AI如何动态调整实验? * 实际业务场景:电商大促的AI优化案例 * 贝叶斯优化 vs 其他AI方法 * 如何在你的系统中落地AI优化? * 步骤1:构建基础数据层 * 步骤2:集成AI优化引擎 * 步骤3:设置停止条件 * 为什么AI优化能避免“实验陷阱”?

By Ne0inhk
小白也能玩 OpenClaw?ToDesk AI桌面助手ToClaw 把门槛打到了零

小白也能玩 OpenClaw?ToDesk AI桌面助手ToClaw 把门槛打到了零

一、开篇 最近"小龙虾"彻底火出圈了。打开抖音、刷刷小红书,满屏都是 OpenClaw 的教程、测评和安装实录。更夸张的是,有人专门上门帮人部署,甚至有公司门口排起了长队——就为了装一只"龙虾"。 这波热度不亚于当年 ChatGPT 刚出来的时候。但热闹背后,有一个问题没人说清楚:这么多人在排队,到底在排什么?排的是环境配置、是服务器、是 API Key、是一堆看不懂的命令行。原生 OpenClaw 能力确实强,但它本质上是一个开源框架,想真正跑起来,你得先过技术这关。对普通用户来说,光是部署这一步,就足够劝退了。 所以问题来了——龙虾这么香,普通人就真的没办法吃到吗? 还真不一定。ToDesk 悄悄做了一件事,把这只龙虾"

By Ne0inhk