未记录事实核验 · 状态:现行内容
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
warning 适用边界与维护说明
本文适用于学习1NF至3NF的基础概念,并依据已声明的候选键与业务函数依赖完成订单表判断及拆分练习;两行样例数据不能证明函数依赖,SQL仅展示拆分前后的表结构,不包含已有数据迁移。BCNF仅在关系图中出现,不属于本文完整讲解范围。本次仅作全文结构审阅,未作外部事实核验或SQL运行验证。
🧩 范式理论
abstract 📋 本节概览
- 🎯 学习目标:理解数据库范式的基本概念及其应用
- 📚 前置知识:表结构设计原则
- ⏱️ 预计用时:20分钟
- 🔧 开发环境:无
- 📊 数据集:无
🎯 学习目标
定义
范式(Normal Form):==用于规范数据库表结构,消除冗余、避免异常,提高数据一致性==
关键特点:
- ✅ 1NF:每个字段不可再分
- ✅ 2NF:满足1NF,且每个非主属性都完全函数依赖于每个候选键,不存在对候选键真子集的部分依赖
- ✅ 3NF:满足2NF,且非主属性不传递依赖于候选键;形式上,每个非平凡函数依赖X → A都要求X是超键或A是主属性
- ⚠️ 注意事项:过度范式化可能影响性能
%%{init: {"theme":"base","themeVariables":{"fontFamily":"PingFang SC, -apple-system, Source Han Serif SC, serif","fontSize":"16px","background":"#FDFBF5","primaryColor":"#FDFBF5","primaryTextColor":"#2D2A26","primaryBorderColor":"#6E6A60","secondaryColor":"#E8EFE8","secondaryBorderColor":"#8FA890","secondaryTextColor":"#2D2A26","tertiaryColor":"#FDFBF5","tertiaryBorderColor":"#9A9488","tertiaryTextColor":"#6E6A60","lineColor":"#6E6A60","textColor":"#2D2A26","mainBkg":"#FDFBF5","nodeBorder":"#2D5A3D","clusterBkg":"#F3EEDF","clusterBorder":"#9A9488","edgeLabelBackground":"#FDFBF5"},"flowchart":{"htmlLabels":true,"curve":"basis","padding":20,"nodeSpacing":60,"rankSpacing":70,"useMaxWidth":false},"themeCSS":".node rect, .node polygon, .node circle { stroke-width: 1.5px; } .edgePath .path { stroke-width: 1.5px; } .cluster-label .nodeLabel, .cluster-label foreignObject { color: #2D2A26 !important; } .edgeLabel, .edgeLabel foreignObject { color: #2D2A26 !important; background-color: #FDFBF5; } .edgeLabel rect { fill: #FDFBF5; }"}}%%
flowchart TD
classDef default fill:#FDFBF5,stroke:#6E6A60,color:#2D2A26,stroke-width:1.5px
classDef startend fill:#2D2A26,stroke:#2D2A26,color:#FDFBF5,font-weight:bold
classDef decision fill:#F6EAD8,stroke:#C08A1A,color:#2D2A26,font-weight:bold
classDef hub fill:#3B5A80,stroke:#3B5A80,color:#FDFBF5,font-weight:bold
classDef io fill:#E5EAF0,stroke:#3B5A80,color:#2D2A26
classDef accent fill:#A6432C,stroke:#A6432C,color:#FDFBF5,font-weight:bold
classDef storage fill:#F3EEDF,stroke:#9A9488,color:#2D2A26
A[范式理论] --> B1[1NF] --> C[2NF] --> D[3NF] --> E[BCNF]
class A,B1,C,D,E default
💻 代码实践
基础用法
-- 满足1NF的表
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
phone VARCHAR(20)
);
进阶应用
-- 示例假设:order_id是唯一候选键,user_id决定user_name,且每位用户可有多笔订单
-- 改造前的表:在上述假设下,user_name传递依赖于order_id,不满足3NF
-- 使用不同表名展示改造前后结构;本示例不包含已有数据迁移
CREATE TABLE orders_before_normalization (
order_id INT PRIMARY KEY,
user_id INT,
user_name VARCHAR(50), -- 冗余
amount DECIMAL(10,2)
);
-- 拆分为:
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (user_id) REFERENCES users(id)
);
tip 💡 代码解读
- 1NF:字段不可再分
- 3NF:消除传递依赖,避免冗余
🔗 知识连接
📊 实战练习
练习1:判断范式 ⭐⭐
假设order_id是唯一候选键,order_id决定其余属性,user_id决定user_name,且每位用户可有多笔订单。依据这些业务函数依赖,判断下列表结构是否满足3NF,并说明理由;表中两行数据仅用于展示,不能单独证明函数依赖。
order_id user_id user_name amount 1 101 Alice 100.0 2 102 Bob 200.0
🔖 总结要点
- 范式理论有助于规范表结构,消除冗余
- 实际设计需兼顾性能与规范
💬 学习反馈
- [ ] 我能说出1NF、2NF、3NF的定义
- [ ] 我能判断表结构是否满足3NF
#SQL #基础 #设计 #范式
相关推荐: