數(shù)據(jù)庫設(shè)計(理論篇)

第一章 需求分析


設(shè)計簡介

根據(jù)業(yè)務(wù)需要妙啃,結(jié)合選用的DBMS疾党,設(shè)計出最有的數(shù)據(jù)存儲模型并建立好數(shù)據(jù)庫中的表結(jié)構(gòu)及表與表之間的關(guān)系使之有效的存儲和高效的訪問音诫。?

數(shù)據(jù)庫設(shè)計

在系統(tǒng)設(shè)計開始就應(yīng)該對數(shù)據(jù)庫進(jìn)行良好的設(shè)計,這樣才能保證以后對業(yè)務(wù)發(fā)展的需要進(jìn)行改進(jìn)雪位,保證系統(tǒng)的穩(wěn)定性竭钝。?

設(shè)計步驟


? ? 需求分析:數(shù)據(jù)庫需求的作用點(數(shù)據(jù)是什么,數(shù)據(jù)有哪些屬性茧泪,數(shù)據(jù)屬性的特點)

? ? 邏輯設(shè)計:用ER圖進(jìn)行建模

? ? 物理設(shè)計:選擇數(shù)據(jù)庫管理系統(tǒng)蜓氨,根據(jù)數(shù)據(jù)庫自身的特點把邏輯設(shè)計轉(zhuǎn)換為物理設(shè)計

? ? 維護(hù)優(yōu)化:對新需求進(jìn)行見表,索引優(yōu)化队伟,大表拆分

需求分析重要性


? ? 1、了解系統(tǒng)中所要存儲的數(shù)據(jù)

? ? 2幽勒、了解數(shù)據(jù)存儲的特點

? ? 3嗜侮、了解數(shù)據(jù)的生命周期

需要了解的問題:

? ? 實體與實體之間的關(guān)系(一對一,一對多啥容,多對多)

? ? 實體所包含的屬性

? ? 哪些屬性或?qū)傩缘慕M合可以唯一標(biāo)識一個實體

實例:小型電子商務(wù)網(wǎng)站


模塊:用戶模塊锈颗,商品模塊,訂單模塊咪惠,購物車模塊击吱,供應(yīng)商模塊

用戶模塊:用于記錄注冊用戶信息

? ? 包括屬性:用戶名、密碼遥昧、電話覆醇、郵箱、身份證號炭臭、地址永脓、姓名、昵稱

? ? 可選唯一標(biāo)識屬性:用戶名鞋仍、身份證常摧、電話

? ? 存儲特點:隨系統(tǒng)上線時間逐漸增加,需要永久存儲

商品模塊:用于記錄網(wǎng)站中所有銷售的商品信息

? ? 包括屬性:商品編碼、商品名稱落午、商品描述谎懦、商品品類、供應(yīng)商名稱溃斋、重量党瓮、有效期、價格盐类。寞奸。。

? ? 可選唯一標(biāo)識屬性:(商品名稱在跳、供應(yīng)商名稱)組合枪萄、(商品編碼)

? ? 存儲特點:對于下線商品可以歸檔存儲

訂單模塊:用于用戶訂購商品的信息

? ? 包括屬性:訂單號、用戶姓名猫妙、用戶電話瓷翻、收貨地址、商品編號割坠、商品名稱齐帚、數(shù)量、價格彼哼、訂單狀態(tài)对妄、支付狀態(tài)、訂單類型敢朱。剪菱。。

? ? 可選唯一標(biāo)識屬性:訂單號

? ? 存儲特點:永久存儲(分表拴签、分庫存儲)

購物車模塊:用于 保存用戶購物時選擇的商品

? ? 包括屬性:用戶名孝常、商品編號、商品名稱蚓哩、商品價格构灸、商品描述、商品分類岸梨、加入時間喜颁、商品數(shù)量。盛嘿。洛巢。

? ? 可選唯一標(biāo)識:(用戶名、商品編號次兆、加入時間)稿茉、(購物車編號)

? ? 存儲特點:不用永久存儲(設(shè)置歸檔、清理規(guī)則)

供應(yīng)商模塊:用于保存所銷售商品的供應(yīng)商信息

? ? 包括屬性:供應(yīng)商編號、供應(yīng)商名稱漓库、聯(lián)系人恃慧、電話、營業(yè)執(zhí)照號渺蒿、地址痢士、法人。茂装。怠蹂。

? ? 可選唯一標(biāo)識:(供應(yīng)商編號),(營業(yè)執(zhí)照號)

? ? 存儲特點:永久存儲


第二章 邏輯設(shè)計


E-R圖


邏輯設(shè)計是做什么的

? ? 1少态、將需求轉(zhuǎn)化為數(shù)據(jù)庫的邏輯模型

? ? 2城侧、通過E-R圖的形式對邏輯模型進(jìn)行展示

? ? 3、同所選用的具體的DBMS系統(tǒng)無關(guān)

名詞解釋

? ? 關(guān)系:一個關(guān)系對應(yīng)通常所說的一張表

? ? 元組:表中的一行即為一個元組

? ? 屬性:表中的一列即為一個屬性彼妻;每一個屬性都有一個名稱嫌佑,稱為屬性名

? ? 候選碼:表中的某個屬性組,它可以確定一個元組

? ? 主碼:一個關(guān)系有多個候選碼侨歉,選定其中一個為主碼

? ? 域:屬性的取值范圍

? ? 分量:元組中的一個屬性值

E-R圖例說明?


實例演示(加下劃線的是主鍵)

設(shè)計范式概要

什么是數(shù)據(jù)庫設(shè)計范式

常見的數(shù)據(jù)庫設(shè)計范式包括:第一范式屋摇,第二范式,第三范式幽邓,BC范式炮温,第四、第五范式

這也是目前我們大多數(shù)數(shù)據(jù)庫設(shè)計所要遵循的范式

數(shù)據(jù)操作異常及數(shù)據(jù)冗余

? 操作異常:

? ? 插入異常:如果某實體隨著另一個實體的存在而存在颊艳,即缺少某個實體時無法表示這個實體茅特,那么這個表就存在插入異常

? ? 更新異常:如果更改表所對應(yīng)的某個實體實例的單獨屬性時,需要將多行更新棋枕,那么就說這個表存在更新異常。

? ? 刪除異常:如果刪除表中的某一行來反應(yīng)某實體實例妒峦,失效時導(dǎo)致另一個不同實體實例信息丟失重斑,那么這個表中就存在刪除異常。

? 數(shù)據(jù)冗余:

? ? 是指相同的數(shù)據(jù)在多個地方存在肯骇,或者說表中的某個列可以由其他列計算得到窥浪,這樣就說表中存在著數(shù)據(jù)冗余。

第一范式(1NF):


定義:數(shù)據(jù)庫表中的所有字段都是單一屬性笛丙,不可再分的漾脂。這個單一屬性是由基本的數(shù)據(jù)類型所構(gòu)成的,如整數(shù)胚鸯,浮點數(shù)骨稿,字符串等;

換句話說 ?第一范式要求數(shù)據(jù)庫中的表都是二維表。

第二范式(2NF)

? 定義:數(shù)據(jù)庫中的表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴坦冠。

部分函數(shù)依賴是指存在著組合關(guān)鍵字中的某一關(guān)鍵字決定非關(guān)鍵字的情況形耗。

換句話說:所有單關(guān)鍵字段的表都符合第二范式

由于供應(yīng)商和商品之間是多對多的關(guān)系,所以只有使用商品名稱和供應(yīng)商名稱才可以唯一標(biāo)識出一件商品辙浑。也就是商品名稱和供應(yīng)商名稱是一組組合關(guān)鍵字激涤。

上表中存在以下的部分函數(shù)依賴關(guān)系

(商品名稱)->(價格,描述判呕,重量倦踢,商品有效期)

(供應(yīng)商名稱)->(供應(yīng)商電話)

存在的問題:插入異常、刪除異常侠草、更新異常辱挥、數(shù)據(jù)冗余

第三范式(3NF)?


定義:第三范式是在第二范式的基礎(chǔ)上定義的,如果數(shù)據(jù)表中不存在非關(guān)鍵字段梦抢,對任意候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式般贼。

存在以下傳遞函數(shù)依賴關(guān)系:

(商品名稱)->(分類)->(分類描述)

也就是說存在非關(guān)鍵字段“分類描述”

對關(guān)鍵字段“商品名稱”的傳遞函數(shù)依賴

存在問題:(分類,分類描述)對于每一個商品都會進(jìn)行記錄奥吩,所以存在著數(shù)據(jù)冗余哼蛆。同時也存在著數(shù)據(jù)的插入,更新及刪除異常

拆分

BC范式


Boyce.Codd范式(BCNF)

定義:在第三范式的基礎(chǔ)上霞赫,數(shù)據(jù)庫表中如果不存在任何字段對任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合BC范式腮介。

也就是說如果是復(fù)合關(guān)鍵字,則復(fù)合關(guān)鍵字之間也不能存在函數(shù)依賴關(guān)系端衰。

(以商品同供應(yīng)商的關(guān)系表來說明BCNF)

假定:供應(yīng)商聯(lián)系人只能受雇于一家供應(yīng)商叠洗,每家供應(yīng)商可以供應(yīng)多個商品,則存在如下決定關(guān)系:

(供應(yīng)商旅东,商品ID)->(聯(lián)系人灭抑,商品數(shù)量)

(聯(lián)系人,商品ID)->(供應(yīng)商抵代,商品數(shù)量)

存在下列關(guān)系因此不符合BCNF要求:

(供應(yīng)商)->(供應(yīng)商聯(lián)系人)

(供應(yīng)商聯(lián)系人)->(供應(yīng)商)

并且存在數(shù)據(jù)操作異常及數(shù)據(jù)冗余

拆分

第三章 物理設(shè)計


物理設(shè)計要做什么

? ? 1腾节、選擇合適的數(shù)據(jù)庫管理系統(tǒng)

? ? 2、定義數(shù)據(jù)庫荤牍、表及字段的命名規(guī)范

? ? 3案腺、根據(jù)所選的DBMS系統(tǒng)選擇合適的字段類型(效率,功能康吵,需求)

? ? 4劈榨、反范式化設(shè)計(冗余)

選擇哪種數(shù)據(jù)庫


?

成本、版權(quán)晦嵌、功能(性能)同辣、操作系統(tǒng)拷姿、開發(fā)語言、應(yīng)用場景

mysql常用的存儲引擎


開源數(shù)據(jù)庫邑闺,只要符合mysql存儲協(xié)議跌前,任何人都可以開發(fā)存儲引擎

主要使用Innodb存儲引擎

mysql常用存儲引擎

表及字段的命名規(guī)范


所有對象命名應(yīng)該遵循下述原則:

? ? 1、可讀性原則:使用大寫和小寫格式化的庫對象名字已獲得良好的可讀性陡舅。

例如:使用CustAddress而不是custaddress來提高可讀性抵乓。

(這里要注意有些DBS系統(tǒng)對表名的大小寫是敏感的)

? ? 2、表意性原則:對象的名字應(yīng)該能夠描述它所標(biāo)識的對象靶衍。

例如:對于表灾炭,表的名稱應(yīng)該能夠體現(xiàn)表中存儲的數(shù)據(jù)內(nèi)容;

對于存儲過程颅眶,存儲過程名稱應(yīng)該能夠體現(xiàn)存儲過程的功能蜈出。

? ? 3、長名原則:盡可能少使用或者不使用縮寫涛酗,適用于數(shù)據(jù)庫(DATABASE)名之外的任一對象铡原。

字段類型選擇原則

生日可選類型

? ? 列的數(shù)據(jù)類型一方面影響數(shù)據(jù)存儲空間的開銷,另一方面也會影響數(shù)據(jù)查詢性能商叹。當(dāng)一個列可以選擇多種數(shù)據(jù)類型時燕刻,應(yīng)該優(yōu)先考慮數(shù)字類型,其次是日期或者二進(jìn)制類型,最后是字符類型。對于相同級別的數(shù)據(jù)類型,應(yīng)該優(yōu)先選擇占用空間小的數(shù)據(jù)類型狂鞋。

各種類型所占存儲空間

如何具體選擇字段類型


char與varchar如何選擇

? ? 原則:

? ? ? ? 1字管、如果列中要存儲的數(shù)據(jù)長度差不多是一致的硫戈,則應(yīng)該考慮用char;否則應(yīng)該考慮用varchar。

? ? ? ? 2、如果劣種的最大數(shù)據(jù)長度小于50Byte猩谊,則一般也考慮用char。

? ? ? ? 3、一般不宜定義大于50Byte的char類型列。

utf8每個字符占三個字節(jié)


decimal與float類型如何選擇

? ? 原則:

? ? ? ? 1、decimal用于存儲精確數(shù)據(jù),而float只能用于存儲非精確數(shù)據(jù)七蜘。

? ? ? ? 2损搬、由于float的存儲空間開銷一般比decimal刑吖亍(精確到7位小數(shù)只需要4個字節(jié),而精確到15位小數(shù)只需要8字節(jié))故非精確數(shù)據(jù)優(yōu)先選擇float類型搂鲫。

數(shù)據(jù)庫設(shè)計的其他注意事項


時間類型存儲:

? ? 1擦酌、使用int來存儲時間字段的優(yōu)缺點

? ? ? ? 優(yōu)點:字段長度比datetime小睁搭。

? ? ? ? 缺點:使用不方便,要進(jìn)行函數(shù)轉(zhuǎn)換笼平。

? ? ? ? 限制:只能存儲到2038-1-19 ?11:14:07即2^32為2147483648

? ? 2园骆、需要存儲的時間粒度

? ? ? ? 年 ?月 ?日 ?時 ?分 ?秒 ?周

數(shù)據(jù)庫設(shè)計其他注意事項

? ? 如何選擇主鍵

? ? ? ? 1、區(qū)分業(yè)務(wù)主鍵和數(shù)據(jù)庫主鍵寓调,業(yè)務(wù)主鍵用于標(biāo)識業(yè)務(wù)數(shù)據(jù)遇伞,進(jìn)行表與表之間的關(guān)聯(lián);數(shù)據(jù)庫主鍵為了優(yōu)化數(shù)據(jù)存儲(Inoodb會生成6個字節(jié)的隱含主鍵)

? ? ? ? 2捶牢、根據(jù)數(shù)據(jù)庫的類型鸠珠,考慮主鍵是否要順序增長,有些數(shù)據(jù)庫是按主鍵的順序邏輯存儲的

? ? ? ? 3秋麸、逐漸的字段類型所占空間要盡可能的小渐排,對于使用聚集索引方式存儲的表,每個索引后都會附加主鍵信息灸蟆。

? ? 避免使用外鍵約束

? ? ? ? 1驯耻、降低數(shù)據(jù)導(dǎo)入的效率

? ? ? ? 2、增加維護(hù)成本

? ? ? ? 3炒考、雖然不建議使用外鍵約束可缚,但是相關(guān)聯(lián)的列上一定要建立索引

? ? 避免使用觸發(fā)器

? ? ? ? 1、降低數(shù)據(jù)導(dǎo)入的效率

? ? ? ? 2斋枢、可能會出現(xiàn)意想不到的數(shù)據(jù)異常帘靡。

? ? ? ? 3、使業(yè)務(wù)邏輯變得復(fù)雜

? ? 關(guān)于預(yù)留字段

? ? ? ? 1瓤帚、無法準(zhǔn)確的知道預(yù)留字段的類型描姚。

? ? ? ? 2、無法準(zhǔn)確的知道預(yù)留字段中所存儲的內(nèi)容戈次。

? ? ? ? 3轩勘、后期維護(hù)預(yù)留字段所需要的成本,同增加一個字段所需要的成本是相同的怯邪。

? ? ? ? 4绊寻、嚴(yán)禁使用預(yù)留字段

反范式化表設(shè)計


? ? 什么是反范式化

? ? ? ? 反范式化是針對范式化而言的,所謂的反范式化就是為了性能和讀取效率的考慮而適當(dāng)?shù)膶Φ谌妒降囊筮M(jìn)行違反悬秉,而允許存在少量的數(shù)據(jù)冗余澄步。換句話說反范式化就是使用空間來換取時間。


? ? 為什么反范式化

? ? ? ? 1搂捧、減少表的關(guān)聯(lián)數(shù)量

? ? ? ? 2驮俗、增加數(shù)據(jù)的讀取效率

? ? ? ? 3、反范式化一定要適度

第四章 維護(hù)和優(yōu)化


維護(hù)和優(yōu)化要做什么


? ? 1允跑、維護(hù)數(shù)據(jù)字典

? ? 2王凑、維護(hù)索引

? ? 3、維護(hù)表結(jié)構(gòu)

? ? 4聋丝、在適當(dāng)?shù)臅r候?qū)Ρ磉M(jìn)行水平拆分或垂直拆分

如何維護(hù)數(shù)據(jù)字典


? ? 1索烹、使用第三方工具對數(shù)據(jù)字典進(jìn)行維護(hù)

? ? 2、利用數(shù)據(jù)庫本身的備注字段來維護(hù)數(shù)據(jù)字典弱睦。以mysql為例

CREATE TABLE costomer(

cust_id INT AUTO_INCREMENT NOT NULL COMMENT '自增ID'百姓,

cust_name VARCHAR(10) NOT NULL COMMENT '客戶姓名',

PRIMARY KEY (cust_id)

) COMMENT '客戶表'

? ? 3、導(dǎo)出數(shù)據(jù)字典

SELECT

a.table_name,b.TABLE_COMMENT,a.COLUMN_NAME,

a.COLUMN_TYPE,a.COLUMN_COMMENTFROM

information_schema.COLUMENS a JOIN information_schema.

TABLE b ON a.table_schema=b.table_schema AND

a.table_name=b.table_name

WHERE a.table_name='customer'

如何維護(hù)索引


? ? 如何選擇合適的列建立索引况木?

? ? ? ? 1垒拢、出現(xiàn)在WHERE從句旬迹,GROUP BY 從句,ORDER BY 從句中的列

? ? ? ? 2求类、可選擇性高的列要放到索引的前面

? ? ? ? 3奔垦、索引中不要包括太長的數(shù)據(jù)類型

? ? 注意事項

? ? ? ? 1、索引并不是越多越好尸疆,過多的索引不但會降低寫效率椿猎,而且會降低讀的效率

? ? ? ? 2、頂起維護(hù)索引碎片

? ? ? ? 3寿弱、在SQL語句中不要使用強(qiáng)制索引關(guān)鍵字

數(shù)據(jù)庫中適合的操作


如何維護(hù)表結(jié)構(gòu)

注意事項:

? ? 1犯眠、使用在線變更表結(jié)構(gòu)的工具

? ? ? ? MySql5.5之前可以使用pt-online-schema-change

? ? ? ? MySql5.6之后本身支持在線表結(jié)構(gòu)的變更

? ? 2、同時對數(shù)據(jù)字典進(jìn)行維護(hù)

? ? 3症革、控制表的寬度和大小

數(shù)據(jù)庫中適合的操作

? ? 1筐咧、批量操作VS逐條操作

? ? 2、禁止使用SELECT *這樣查詢

? ? 3地沮、控制使用用戶自定義函數(shù)

? ? 4嗜浮、不要使用數(shù)據(jù)庫中的全文索引

表的垂直拆分和水平拆分




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摩疑,隨后出現(xiàn)的幾起案子危融,更是在濱河造成了極大的恐慌,老刑警劉巖雷袋,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吉殃,死亡現(xiàn)場離奇詭異,居然都是意外死亡楷怒,警方通過查閱死者的電腦和手機(jī)蛋勺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸠删,“玉大人抱完,你說我怎么就攤上這事∪信荩” “怎么了巧娱?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烘贴。 經(jīng)常有香客問我禁添,道長,這世上最難降的妖魔是什么桨踪? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任老翘,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铺峭。我一直安慰自己墓怀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布逛薇。 她就那樣靜靜地躺著捺疼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪永罚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天卧秘,我揣著相機(jī)與錄音呢袱,去河邊找鬼。 笑死翅敌,一個胖子當(dāng)著我的面吹牛羞福,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蚯涮,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼治专,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遭顶?” 一聲冷哼從身側(cè)響起张峰,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棒旗,沒想到半個月后喘批,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體利术,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡爬舰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了虑瀑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逛拱。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡敌厘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朽合,到底是詐尸還是另有隱情俱两,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布旁舰,位于F島的核電站锋华,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏箭窜。R本人自食惡果不足惜毯焕,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纳猫,春花似錦婆咸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侵续,卻和暖如春倔丈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背状蜗。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工需五, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轧坎。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓宏邮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缸血。 傳聞我的和親對象是個殘疾皇子蜜氨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容