Skip to content

Commit 252a2f9

Browse files
committed
📖docs
1 parent 1ac9d77 commit 252a2f9

File tree

9 files changed

+1174
-459
lines changed

9 files changed

+1174
-459
lines changed

docs/.DS_Store

0 Bytes
Binary file not shown.

docs/.obsidian/core-plugins.json

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
1-
[
2-
"file-explorer",
3-
"global-search",
4-
"switcher",
5-
"graph",
6-
"backlink",
7-
"canvas",
8-
"outgoing-link",
9-
"tag-pane",
10-
"page-preview",
11-
"daily-notes",
12-
"templates",
13-
"note-composer",
14-
"command-palette",
15-
"editor-status",
16-
"bookmarks",
17-
"outline",
18-
"word-count",
19-
"file-recovery"
20-
]
1+
{
2+
"file-explorer": true,
3+
"global-search": true,
4+
"switcher": true,
5+
"graph": true,
6+
"backlink": true,
7+
"outgoing-link": true,
8+
"tag-pane": true,
9+
"page-preview": true,
10+
"daily-notes": true,
11+
"templates": true,
12+
"note-composer": true,
13+
"command-palette": true,
14+
"slash-command": false,
15+
"editor-status": true,
16+
"starred": true,
17+
"markdown-importer": false,
18+
"zk-prefixer": false,
19+
"random-note": false,
20+
"outline": true,
21+
"word-count": true,
22+
"slides": false,
23+
"audio-recorder": false,
24+
"workspaces": false,
25+
"file-recovery": true,
26+
"publish": false,
27+
"sync": false,
28+
"canvas": true,
29+
"bookmarks": true,
30+
"properties": false
31+
}

docs/.obsidian/workspace.json

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
"file": "data-management/MySQL/MySQL-Index.md",
1717
"mode": "preview",
1818
"source": false
19-
}
19+
},
20+
"icon": "lucide-file",
21+
"title": "MySQL-Index"
2022
}
2123
},
2224
{
@@ -28,7 +30,9 @@
2830
"file": "data-structure-algorithms/soultion/LinkedList-Soultion.md",
2931
"mode": "source",
3032
"source": false
31-
}
33+
},
34+
"icon": "lucide-file",
35+
"title": "LinkedList-Soultion"
3236
}
3337
},
3438
{
@@ -40,15 +44,19 @@
4044
"file": "data-management/Redis/Redis-Datatype.md",
4145
"mode": "source",
4246
"source": false
43-
}
47+
},
48+
"icon": "lucide-file",
49+
"title": "Redis-Datatype"
4450
}
4551
},
4652
{
4753
"id": "c7c1397df03f59cc",
4854
"type": "leaf",
4955
"state": {
5056
"type": "empty",
51-
"state": {}
57+
"state": {},
58+
"icon": "lucide-file",
59+
"title": "新标签页"
5260
}
5361
},
5462
{
@@ -60,7 +68,9 @@
6068
"file": "data-structure-algorithms/soultion/DP-Solution.md",
6169
"mode": "source",
6270
"source": false
63-
}
71+
},
72+
"icon": "lucide-file",
73+
"title": "DP-Solution"
6474
}
6575
},
6676
{
@@ -72,7 +82,9 @@
7282
"file": "data-structure-algorithms/soultion/DP-Solution.md",
7383
"mode": "source",
7484
"source": false
75-
}
85+
},
86+
"icon": "lucide-file",
87+
"title": "DP-Solution"
7688
}
7789
}
7890
],
@@ -96,7 +108,9 @@
96108
"type": "file-explorer",
97109
"state": {
98110
"sortOrder": "alphabetical"
99-
}
111+
},
112+
"icon": "lucide-folder-closed",
113+
"title": "文件列表"
100114
}
101115
},
102116
{
@@ -111,23 +125,29 @@
111125
"collapseAll": false,
112126
"extraContext": false,
113127
"sortOrder": "alphabetical"
114-
}
128+
},
129+
"icon": "lucide-search",
130+
"title": "搜索"
115131
}
116132
},
117133
{
118134
"id": "c7bda26138bbb70d",
119135
"type": "leaf",
120136
"state": {
121137
"type": "starred",
122-
"state": {}
138+
"state": {},
139+
"icon": "lucide-file",
140+
"title": "插件不再活动"
123141
}
124142
},
125143
{
126144
"id": "123cfa366479ce4d",
127145
"type": "leaf",
128146
"state": {
129147
"type": "bookmarks",
130-
"state": {}
148+
"state": {},
149+
"icon": "lucide-bookmark",
150+
"title": "书签"
131151
}
132152
}
133153
]
@@ -158,7 +178,9 @@
158178
"searchQuery": "",
159179
"backlinkCollapsed": false,
160180
"unlinkedCollapsed": true
161-
}
181+
},
182+
"icon": "links-coming-in",
183+
"title": "Redis-Datatype 的反向链接列表"
162184
}
163185
},
164186
{
@@ -170,7 +192,9 @@
170192
"file": "data-management/Redis/Redis-Datatype.md",
171193
"linksCollapsed": false,
172194
"unlinkedCollapsed": true
173-
}
195+
},
196+
"icon": "links-going-out",
197+
"title": "Redis-Datatype 的出链列表"
174198
}
175199
},
176200
{
@@ -181,7 +205,9 @@
181205
"state": {
182206
"sortOrder": "frequency",
183207
"useHierarchy": true
184-
}
208+
},
209+
"icon": "lucide-tags",
210+
"title": "标签"
185211
}
186212
},
187213
{
@@ -191,7 +217,9 @@
191217
"type": "outline",
192218
"state": {
193219
"file": "data-management/Redis/Redis-Datatype.md"
194-
}
220+
},
221+
"icon": "lucide-list",
222+
"title": "Redis-Datatype 的大纲"
195223
}
196224
}
197225
],
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
---
2+
title: 数据库三范式
3+
date: 2022-08-01
4+
tags:
5+
- MySQL
6+
- 数据库三范式
7+
categories: MySQL
8+
---
9+
10+
![](https://cdn.pixabay.com/photo/2020/04/23/18/41/light-5083606_1280.jpg)
11+
12+
> 数据库的设计三范式:
13+
>
14+
> - 1NF:字段不可分。第一范式要求数据原子化
15+
> - 2NF:唯一性 一个表只说明一个事物。有主键,非主键字段依赖主键。第二范式消除部分依赖
16+
> - 3NF:非主键字段不能相互依赖。第三范式消除传递依赖,从而提高数据的完整性和一致性
17+
18+
在当今信息化时代,数据库已经成为各行各业中不可或缺的一部分。从小型应用到企业级系统,数据库都在背后默默支撑着数据的存储、管理与分析。而在数据库设计中,**三范式**(3NF)是关系型数据库模型设计中最为基础和重要的规范化原则之一。三范式的核心目标是通过规范化数据库的结构,减少冗余数据,增强数据一致性和完整性,避免更新异常,确保数据的高效存储与访问。
19+
20+
### 什么是数据库规范化?
21+
22+
数据库规范化(Normalization)是指对数据库表的设计进行优化的过程,通过一系列规则来消除冗余数据,并提高数据的组织方式。规范化不仅帮助减少数据的重复性,还确保数据之间的逻辑关系清晰,减少因数据修改引发的不一致问题。
23+
24+
规范化的核心思想是通过分解数据库表,降低数据冗余性和依赖性。在实际操作中,数据库规范化通常分为多个阶段,称为**范式**。每一范式都是在前一范式的基础上进一步精化和完善的。三范式是数据库设计中最为基础且常用的范式,它通过消除部分依赖和传递依赖等问题,保证数据库的高效性与一致性。
25+
26+
### 第一范式(1NF)
27+
28+
**第一范式**是数据库规范化的最基础范式,它的要求是:**表中的每个列必须包含原子值,即每个字段只能存储不可再分的单一数据单元**。简而言之,1NF 要求每个列的数据必须是“原子的”,也就是没有重复数据和多值属性。
29+
30+
#### 1NF的具体要求:
31+
32+
1. 每列中的数据必须是不可分割的单一数据项。
33+
2. 每一行必须唯一,不允许有重复的记录。
34+
3. 表中的每个字段都必须具有唯一的标识符(即主键)。
35+
36+
**示例**: 假设我们有一个学生信息表,如下所示:
37+
38+
| 学生ID | 姓名 | 电话号码 |
39+
| ------ | ---- | ---------------------- |
40+
| 1 | 张三 | 1234567890, 0987654321 |
41+
| 2 | 李四 | 1357924680, 2468013579 |
42+
43+
从上表可以看出,"电话号码"字段存储了多个值,违反了1NF。要满足1NF要求,电话号码字段应拆分为多行或多列,像这样:
44+
45+
| 学生ID | 姓名 | 电话号码 |
46+
| ------ | ---- | ---------- |
47+
| 1 | 张三 | 1234567890 |
48+
| 1 | 张三 | 0987654321 |
49+
| 2 | 李四 | 1357924680 |
50+
| 2 | 李四 | 2468013579 |
51+
52+
这样,每个字段就变成了原子值,符合了1NF的要求。
53+
54+
### 第二范式(2NF)
55+
56+
第二范式建立在第一范式的基础之上,要求**消除部分依赖**。具体而言,2NF要求表中的所有非主属性(即不参与主键的字段)必须完全依赖于主键,而不能仅依赖于主键的一部分。换句话说,表中的每一个非主属性必须依赖于完整的主键,而不是主键的某一部分。
57+
58+
#### 2NF的要求:
59+
60+
1. 表必须满足1NF。
61+
2. 表中的每个非主键列必须完全依赖于整个主键。
62+
3. 如果表有复合主键(由多个列组成的主键),则不能有部分依赖。
63+
64+
**示例**: 考虑以下的订单表:
65+
66+
| 订单ID | 产品ID | 产品名称 | 数量 | 单价 |
67+
| ------ | ------ | -------- | ---- | ---- |
68+
| 1 | 101 | 手机 | 2 | 2000 |
69+
| 1 | 102 | 耳机 | 1 | 500 |
70+
| 2 | 101 | 手机 | 1 | 2000 |
71+
72+
在这个例子中,复合主键由**订单ID****产品ID**组成。虽然**产品名称**只依赖于**产品ID**,但它却被存储在了当前的表中,这种依赖关系违反了2NF。我们可以通过拆分表格来消除部分依赖:
73+
74+
**订单表:**
75+
76+
| 订单ID | 产品ID | 数量 | 单价 |
77+
| ------ | ------ | ---- | ---- |
78+
| 1 | 101 | 2 | 2000 |
79+
| 1 | 102 | 1 | 500 |
80+
| 2 | 101 | 1 | 2000 |
81+
82+
**产品表:**
83+
84+
| 产品ID | 产品名称 |
85+
| ------ | -------- |
86+
| 101 | 手机 |
87+
| 102 | 耳机 |
88+
89+
通过这样的拆分,我们确保了所有非主键字段完全依赖于复合主键,符合了2NF。
90+
91+
### 第三范式(3NF)
92+
93+
第三范式是在第二范式的基础上进一步规范化,它要求消除**传递依赖**。传递依赖是指某个非主键列依赖于另一个非主键列,而这个非主键列又依赖于主键。换句话说,第三范式要求表中的每个非主属性都直接依赖于主键,而不是间接依赖。
94+
95+
#### 3NF的要求:
96+
97+
1. 表必须满足2NF。
98+
2. 表中的每个非主键列必须直接依赖于主键,不能依赖于其他非主键列。
99+
100+
**示例**: 考虑以下员工表:
101+
102+
| 员工ID | 部门ID | 部门名称 | 部门经理 |
103+
| ------ | ------ | -------- | -------- |
104+
| 1 | 101 | 销售部 | 王经理 |
105+
| 2 | 102 | 技术部 | 张经理 |
106+
107+
在这个例子中,**部门名称****部门经理**依赖于**部门ID**,而**部门ID**又依赖于**员工ID**,这就构成了传递依赖。为了满足3NF,我们应该将部门相关信息提取到单独的表中:
108+
109+
**员工表:**
110+
111+
| 员工ID | 部门ID |
112+
| ------ | ------ |
113+
| 1 | 101 |
114+
| 2 | 102 |
115+
116+
**部门表:**
117+
118+
| 部门ID | 部门名称 | 部门经理 |
119+
| ------ | -------- | -------- |
120+
| 101 | 销售部 | 王经理 |
121+
| 102 | 技术部 | 张经理 |
122+
123+
通过这样的拆分,我们消除了传递依赖,确保了表符合3NF的要求。
124+
125+
### 规范化的优点与实际应用
126+
127+
数据库规范化的主要优点是减少冗余数据,提高数据的一致性和完整性。通过规范化,数据的修改操作变得更加简便,不容易出现更新异常,例如**插入异常****删除异常****更新异常**
128+
129+
然而,在实际应用中,数据库设计并非总是严格遵循最高范式。过度规范化可能会导致表的拆分过多,从而影响查询性能。在这种情况下,数据库设计师可能会选择在一定程度上**反规范化**,即故意增加一些冗余数据,以提高查询效率。
130+
131+
### 总结
132+
133+
数据库的三范式是关系型数据库设计的基础,它通过消除数据冗余和不必要的依赖关系,帮助提高数据的一致性和完整性。第一范式要求数据原子化,第二范式消除部分依赖,而第三范式消除传递依赖。在实际的数据库设计中,三范式为我们提供了科学的规范化思路,但在一些特定场景下,可能需要适当进行反规范化来优化查询性能。
134+
135+
了解并掌握三范式的概念,能帮助开发人员在设计数据库时做出更加高效且一致的决策,提升数据库系统的整体性能和可维护性。
136+
0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)