MySQL?數(shù)據(jù)庫范式化設(shè)計(jì)理論總結(jié)
一、設(shè)計(jì)范式
問題: 什么是范式化設(shè)計(jì),為什么需要反規(guī)范化設(shè)計(jì) ?
范式來自來自英文Normal From
。開發(fā)過程中要設(shè)計(jì)一個好的數(shù)據(jù)庫邏輯關(guān)系,必須滿足一定的約束條件,此約束條件形成了開發(fā)范式,分成幾個等級,一級比一級嚴(yán)格。
滿足這些范式理論上可以讓我們的數(shù)據(jù)庫邏輯結(jié)構(gòu)更加簡潔、清晰。
以下是常見的四種范式:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- 第四范式(BCNF)
1.第一范式(1NF)
- 每一列都是不可再分的屬性值,確保每一列的原子性;
- 兩列的屬性相近或者相似或者一樣,盡量合并屬性一樣的列,確保不產(chǎn)生冗余數(shù)據(jù);
- 單一屬性的列為基本數(shù)據(jù)類型構(gòu)成;
- 設(shè)計(jì)出來的表都是簡單的二維表。
舉例:用戶收貨地址 反例:
姓名 | 電話 | 地址 |
---|---|---|
張三 | 138000000 | 北京市-朝陽區(qū)-酒仙橋街道 |
正例:
姓名 | 電話 | 省 | 市 | 區(qū) | 街道 |
---|---|---|---|---|---|
張三 | 138000000 | - | 北京市 | 朝陽區(qū) | 酒仙橋街道 |
總結(jié):每列都是不可再分的原子值(一個列不可再分,比如通訊地址和省、市、區(qū))
2.第二范式(2NF)
- 第二范式(2NF)是在第一范式的基礎(chǔ)上建立起來的。
- 第二范式(2NF)要求實(shí)體的屬性完全依賴與主鍵關(guān)聯(lián)。所謂完成依賴是指不能存在與存在依賴關(guān)鍵字的部分屬性,如果存在那么這個屬性和關(guān)鍵字部分應(yīng)該分離出來形成一個新的實(shí)體,新實(shí)體與原實(shí)體是一對多的關(guān)系。
反例:
產(chǎn)品 ID | 用戶ID | 產(chǎn)品名稱 | 用戶姓名 | 購買數(shù)量 | 下單時間 |
---|---|---|---|---|---|
100 | 1 | 微波爐 A102 | 王麻子 | 1 | 2022-08-08 |
正例: 訂單表
產(chǎn)品 ID | 用戶ID | 購買數(shù)量 | 下單時間 |
---|---|---|---|
100 | 1 | 1 | 2022-08-08 |
產(chǎn)品表
產(chǎn)品 ID | 產(chǎn)品名稱 |
---|---|
100 | 微波爐 A102 |
用戶表
用戶ID | 用戶姓名 |
---|---|
1 | 王麻子 |
總結(jié):消除列對主鍵的部分函數(shù)依賴(對于組合主鍵的部分依賴,比如:產(chǎn)品ID + 用戶ID 為主鍵,存在用戶名稱,產(chǎn)品名稱等部分主鍵依賴字段)
3.第三范式 (3NF)
- 滿足第三范式(3NF)必須滿足第二范式(2NF)。
- 第三范式(3NF) 要求一個數(shù)據(jù)表中不包含已在其他表中包含的非主鍵關(guān)鍵字信息,即數(shù)據(jù)不能存在傳遞關(guān)系,即每個屬性都跟主鍵有關(guān)系直接關(guān)系而不是間接關(guān)系。
反例:
訂單ID | 用戶ID | 產(chǎn)品ID | 產(chǎn)品名稱 | 產(chǎn)品廠家 |
---|---|---|---|---|
1 | 1 | 100 | 微波爐 A102 | 美的 |
2 | 2 | 200 | 變頻空調(diào) B101 | 海爾 |
正例: 訂單表
訂單ID | 用戶ID | 產(chǎn)品ID |
---|---|---|
1 | 1 | 100 |
2 | 2 | 200 |
商品信息表
產(chǎn)品ID | 產(chǎn)品名稱 | 產(chǎn)品廠家 |
---|---|---|
100 | 微波爐 A102 | 美的 |
200 | 變頻空調(diào) B101 | 海爾 |
總結(jié):消除字段對非主鍵的傳遞依賴(就是需要取消訂單中比如商品名稱、商品地址等冗余信息)。
二、范式化設(shè)計(jì)
在真正的數(shù)據(jù)庫規(guī)范定義上,非常的嚴(yán)謹(jǐn),比如第二范式(2NF)的定義“若某關(guān)系 R 術(shù)語第一范式,且每個非主屬性完全函數(shù)依賴于候選碼,則關(guān)系 R 屬于第二范式”。
結(jié)論:并不是說完全符合規(guī)范化理論的設(shè)計(jì)是最完美的設(shè)計(jì),而是要看具體的業(yè)務(wù)場景反復(fù)實(shí)踐總結(jié)最合適的設(shè)計(jì)。
三、反規(guī)范化設(shè)計(jì)
所謂反規(guī)范化設(shè)計(jì),就是針對規(guī)范化而言的。 1、為了性能和讀取效率而適當(dāng)?shù)倪`反對數(shù)據(jù)庫范式設(shè)計(jì)的要求; 3、為了查詢的性能,允許存在部分(少量)冗余數(shù)據(jù)。換句話說,反規(guī)范化設(shè)計(jì)就是直接用空間換時間。
- 商品信息
ID | 商品名稱 | 商品價格 | 商品描述 | 商品圖片地址 |
---|---|---|---|---|
1 | 微波爐 A101 | $100.99 | 可以加熱食物的微波爐 | tupian.baidu.com |
- 分類信息
分類 ID | 分類名稱 |
---|---|
1 | 電器 |
- 商品分類對應(yīng)關(guān)系表
商品ID | 分類ID |
---|---|
1 | 1 |
- 商品信息反規(guī)范化設(shè)計(jì)
ID | 商品名稱 | 分類名稱 | 商品價格 | 商品描述 | 商品圖片地址 |
---|---|---|---|---|---|
1 | 1 | 電器 | $100.99 | 可以加熱食物的微波爐 | tupian.baidu.com |
四、設(shè)計(jì)總結(jié)
- 數(shù)據(jù)庫的規(guī)劃化范式設(shè)計(jì),在邏輯結(jié)構(gòu)上可以讓結(jié)構(gòu)更加細(xì)粒度,容易理解。
- 但是我們在實(shí)際的開發(fā)過程中,需要考慮性能和時間成本,往往或多或少,會允許數(shù)據(jù)冗余(反規(guī)范化設(shè)計(jì)),通??梢赃_(dá)到 2NF。
到此這篇關(guān)于MySQL 數(shù)據(jù)庫范式設(shè)計(jì)理論總結(jié)的文章就介紹到這了,更多相關(guān)MySQL 數(shù)據(jù)庫設(shè)計(jì)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 表數(shù)據(jù)的導(dǎo)入導(dǎo)出操作示例
這篇文章主要介紹了MySQL 表數(shù)據(jù)的導(dǎo)入導(dǎo)出操作,結(jié)合實(shí)例形式分析了MySQL 表數(shù)據(jù)的導(dǎo)入導(dǎo)出操作基本命令、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04mysql多表聯(lián)合查詢返回一張表的內(nèi)容實(shí)現(xiàn)代碼
在使用mysql多表聯(lián)合查詢時怎樣可以做到只返回返回一張表的內(nèi)容,本文將詳細(xì)介紹,需要了解的朋友可以參考下2012-12-12PHP MYSQL注入攻擊需要預(yù)防7個要點(diǎn)
這篇文章主要介紹了PHP MYSQL開發(fā)中,對于注入攻擊需要預(yù)防的7個要點(diǎn),大家需要注意了2013-11-11MySQL?中的count(*)?與?count(1)?誰更快一些?
這篇文章主要討論MySQL?中?count(*)?與?count(1)?誰更快一些?以下討論基于?InnoDB?存儲引擎,并且再文末單獨(dú)說一下MyISAM?,感興趣的小伙伴可以參考一下2022-02-02解決sql server不支持variant數(shù)據(jù)類型的問題
在數(shù)據(jù)庫中,數(shù)據(jù)類型是非常重要的,但有時候我們可能會遇到 SQL Server 不支持的數(shù)據(jù)類型,例如 Variant,在本篇博文中,我們將探討問題的背景,提供解決思路,并總結(jié)如何解決 SQL Server 不支持 Variant 數(shù)據(jù)類型的挑戰(zhàn)2023-09-09