# mysql三范式
范式|詳情
---|---
[第一范式](#第一范式)|要求數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值。
[第二范式](#第二范式)|實體中沒一行的所有非主屬性都必須完全依賴于主鍵;即:非主屬性必須完全依賴于主鍵。
[第三范式](#第三范式)|實體中的屬性不能是其他實體中的非主屬性。因為這樣會出現冗余。即:屬性不依賴于其他非主屬性。
## 第一范式
```text
數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值。
```
- 不符合第一范式的實例:

- 存在問題:
- 最后一條記錄和第一條重復(不唯一,沒有主鍵)
- 聯系方式字段可以再分,不是原子性的

```text
關于第一范式,每一行必須唯一,也就是每個表必須有主鍵,這是數據庫設計的最基本要求,主要采用數值型或定長字符串表示,關于列不可再分,應該根據具體的情況來決定。如聯系方式,為了開發上的便利可能就采用一個字段。
```
## 第二范式
```text
第二范式是建立在第一范式基礎上的,另外要求所有非主鍵字段完全依賴主鍵,不能產生部分依賴
```
實例:

確定主鍵:

```text
以上雖然確定了主鍵,但此表會出現大量的冗余,主要涉及到的冗余字段為“學生姓名”和“教師姓名”,出現冗余的原因在于,學生姓名部分依賴了主鍵的一個字段學生編號,而沒有依賴教師編號,而教師姓名部分依賴了主鍵的一個字段教師編號,這就是第二范式部分依賴。
```
解決:

## 第三范式
建立在第二范式基礎上的,非主鍵字段不能傳遞依賴于主鍵字段(不要產生傳遞依賴)

上表中,班級名稱字段存在冗余,因為班級名稱字段沒有直接依賴于主鍵,班級名稱字段依賴于班級編號,班級編號依賴于學生編號,這就是傳遞依賴,解決的辦法就是將冗余字段單獨拿出來建立表:

### 總結
實際開發中,數據庫設計盡量遵循三范式,但是還是根據實際情況進行取舍,有時可能會拿冗余換速度,最終目的是要滿足客戶需求
- 簡介
- php
- php基礎
- php常用數組函數
- php常用字符串函數
- php魔術方法
- php高階
- swoole
- php優化
- workerman
- PHP底層運行機制和原理
- php框架
- laravel
- 前端
- react
- 爬蟲
- Scrapy
- Linux
- IO復用
- nginx
- nginx進程工作原理
- nginx配置
- 正向代理反向代理
- UPSTREAM
- SERVER
- HTTPS
- queue
- kafka
- redis
- DB
- mysql
- 存儲引擎
- 索引
- 鎖
- 觸發器
- 分庫分表
- 三范式
- 負載均衡
- 事務
- EXPLAN
- mysql死鎖
- mysql索引覆蓋與回表
- mysql聚簇索引與非聚簇索引
- NoSql
- memcache
- redis
- mongo
- 網絡協議
- tcp與udp
- https與http
- 架構
- LNMP架構下HTTP請求的調用次序
- 數據結構&算法
- 基礎數據結構
- Linked List
- array
- stack
- queue
- tree
- hash
- heap
- 常見算法
- 排序算法
- 查找算法
- 其他
- php的一些坑
- 常問面試題
- 技術面試最后反問面試官的話
- hr
- redis緩存擊穿、穿透、雪崩
- 面試中回答的不好的問題
- web攻擊防范