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

原文地址: http://www.reibang.com/p/a7823880e6d9

本文為慕課網(wǎng)的《數(shù)據(jù)庫設計那些事》的學習筆記,系統(tǒng)的整理了數(shù)據(jù)庫設計的相關概念和整個流程,并加入了一些內容和鏈接來補充.

1. 數(shù)據(jù)庫設計簡介

建立數(shù)據(jù)庫應用系統(tǒng)的設計看作檢大廈的過程枷恕。大廈建立之前滓鸠,要先設計把还、繪制圖紙、按照圖紙建設大廈选脊。數(shù)據(jù)庫相當于我們大廈的地基

1.1 什么是數(shù)據(jù)庫設計凹耙?

就是根據(jù)業(yè)務系統(tǒng)的具體要求嗦篱,結合我們所選用的數(shù)據(jù)庫管理系統(tǒng),為這個業(yè)務系統(tǒng)構造出最優(yōu)的數(shù)據(jù)存儲模型纹腌,并建立好數(shù)據(jù)庫中的表結構及表與表之間的關聯(lián)關系的過程霎终。使之能有效的對應用系統(tǒng)中的數(shù)據(jù)進行存儲,并可以高效地對已經(jīng)存儲的數(shù)據(jù)進行訪問升薯。

1.2 常見的數(shù)據(jù)庫管理系統(tǒng)

  • 關系型: mysql莱褒、oracle、sql server涎劈、postgres等
  • 非關系型: mongo广凸、memcache、redis

1.3 為什么要進行數(shù)據(jù)庫設計蛛枚?

數(shù)據(jù)庫系統(tǒng)是應用系統(tǒng)存儲數(shù)據(jù)的關鍵組成部分谅海,是系統(tǒng)穩(wěn)定運行的基礎,決定著系統(tǒng)是否可以高效地運行蹦浦。

  • 優(yōu)良的設計:減少數(shù)據(jù)冗余扭吁,避免數(shù)據(jù)維護異常,節(jié)約空間盲镶,高效訪問智末。
  • 糟糕的設計:存在大量的數(shù)據(jù)冗余,存在數(shù)據(jù)插入徒河、更新系馆、刪除異常,浪費大量存儲空間顽照,訪問數(shù)據(jù)低效由蘑。

2. 數(shù)據(jù)庫設計的步驟

  1. 數(shù)據(jù)庫設計的步驟:
    需求分析-〉邏輯設計-〉物理設計-〉維護優(yōu)化
  2. 數(shù)據(jù)庫需求的作用點:數(shù)據(jù)是什么、數(shù)據(jù)有哪些屬性代兵、數(shù)據(jù)和屬性各自的特點有哪些
  3. 邏輯設計:使用ER圖對數(shù)據(jù)庫進行邏輯建模尼酿,之后就可以在大多數(shù)數(shù)據(jù)庫管理系統(tǒng)中進行表的設計
  4. 物理設計: 根據(jù)數(shù)據(jù)庫自身的特點把邏輯設計轉換為物理設計。
  5. 維護設計:根據(jù)新的需求從新進行相關的邏輯設計植影、建表裳擎、索引優(yōu)化、大表拆分等等
image

2.1 需求分析

需求分析過程中需要了解的重要內容,直接進行表設計導致設計出來的表不是最優(yōu)化的思币,必須首先進行需求分析鹿响。

  1. 了解系統(tǒng)中所要存儲的數(shù)據(jù)有哪些
  2. 了解數(shù)據(jù)的存儲特點:比如有些有時效性羡微,定期歸檔和清理。還有些數(shù)據(jù)增長很快惶我,數(shù)據(jù)量也很大妈倔,但他不是系統(tǒng)的核心數(shù)據(jù),分庫绸贡、分表方式存儲盯蝴。比如日志定期歸檔和清理
  3. 了解數(shù)據(jù)的生命周期

要搞清一些問題:

  1. 實體(對象)與實體之間的關系 實體與表的對應關系、實體與實體的對應關系 1對1听怕,隊多捧挺,多對多,
  2. 實體所包含的屬性有什么尿瞭?
  3. 哪些屬性或屬性的組合可以唯一標識一個實體闽烙,

示例:

購物車模塊:

用于保存用戶購物是選對的商品
包括屬性:用戶名、商品編號筷厘、商品名稱鸣峭、商品價格宏所、商品描述酥艳、商品分類,加入時間爬骤,商品數(shù)量
可選唯一標識:(用戶名充石、商品編號、加入時間)霞玄、(購物車編號)
存儲特點:不用永久存儲(設置歸檔骤铃、清理規(guī)則)

供應商模塊:

用于保存所銷售商品的供應商信息
包括屬性:供應商上編號、供應商名稱坷剧、聯(lián)系人惰爬、電話、營業(yè)執(zhí)照號惫企、地址撕瞧、法人。狞尔。丛版。
可選唯一標識:(供應商編號),(營業(yè)執(zhí)照號)
存儲特點:永久存儲

2.2 邏輯設計

  1. 將需求轉化為數(shù)據(jù)庫的邏輯模型
  2. 通過ER圖的形式對邏輯模型進行展示
  3. 同所選用的具體的數(shù)據(jù)庫管理系統(tǒng)無關

2.3 物理設計

流程:

  1. 選擇合適的數(shù)據(jù)庫管理系統(tǒng)(DBMS: oracle,mysql等).
  2. 定義數(shù)據(jù)庫独令、表及字段的命名規(guī)范.
  3. 根據(jù)所選的DBMS系統(tǒng)選擇合適的字段類型.
  4. 反規(guī)范設計.

2.3.1 mysql常見存儲引擎(以mysql為例)

image

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

  1. 可讀性原則: 使用大寫和小寫來格式化的庫對象名字以獲得良好的可讀性.例如:使用CustAddress 而不是custaddress
  2. 表意性原則: 名稱體現(xiàn)意義
  3. 長名原則:盡可能少使用或者不使用縮寫

2.3.3 字段類型的選擇原則

  1. 考慮存儲開銷
  2. 考慮查詢性能

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

  • a. 如何選擇主鍵:
    1. 區(qū)分業(yè)務主鍵和數(shù)據(jù)庫主鍵
      • 業(yè)務主鍵用于標識業(yè)務數(shù)據(jù),進行表與表之間的關聯(lián)
      • 數(shù)據(jù)庫主鍵為了優(yōu)化數(shù)據(jù)庫存儲(Innodb會生成6個字節(jié)的隱含主鍵)
    2. 根據(jù)數(shù)據(jù)庫的類型州胳,考慮主鍵是否要順序增長
      • 有些數(shù)據(jù)庫是按主鍵的順序邏輯存儲的
    3. 主鍵的字段類型所占空間要盡可能的小
      • 對于使用聚集索引方式存儲的表记焊,每個索引后都會附加主鍵信息
  • b. 避免使用外鍵約束, 原因:
    1. 降低數(shù)據(jù)導入的效率
    2. 增加維護成本
    3. 雖然不建議使用外鍵約束,但是相關關聯(lián)的列上一定要建立索引
  • c. 避免使用觸發(fā)器, 原因:
    1. 降低數(shù)據(jù)導入的效率
    2. 可能會出現(xiàn)意想不到的數(shù)據(jù)異常
    3. 使業(yè)務邏輯變的復雜
  • d. 關于預留字段, 原因:
    1. 無法準確的知道預留字段的類型
    2. 無法準確的知道預留字段中所存儲的內容
    3. 后期維護預留字段所要的成本栓撞,同增加一個字段所需要的成本是相同的
    4. 嚴禁使用預留字段

2.3.5 反范式化表設計

反范式化:允許存在少量的數(shù)據(jù)冗余遍膜,適當對第三范式進行違反,
目的:使用空間來換取時間,提高性能和讀寫效率瓤湘。

為什么反范式化:

  1. 減少表的關聯(lián)數(shù)量
  2. 增加數(shù)據(jù)的讀取效率
  3. 反范式化一定要適度

示例:


image

2.4 維護優(yōu)化

維護和優(yōu)化的工作:

  1. 維護數(shù)據(jù)字典
  2. 維護索引
  3. 維護表結構
  4. 在適當?shù)臅r候對表進行水平拆分和垂直拆分

MySQL索引背后的數(shù)據(jù)結構及算法原理

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

  1. 使用第三方工具對數(shù)據(jù)字典進行維護
  2. 利用數(shù)據(jù)庫本身的備注字段來維護數(shù)據(jù)字典

2.4.2 如何維護索引

如何選擇合適的列建立索引:

  1. 出現(xiàn)在WHERE從句瓢颅,GROUP BY從句,ORDER BY從句中的列
  2. 可選性高的列要放到索引的前面
  3. 索引中不要包括太長的數(shù)據(jù)庫類型
    注意事項:
  4. 索引并不是越多越好弛说,過多的索引不但會降低寫效率挽懦,而且會降低讀的效率
  5. 定期維護索引碎片
  6. 在SQL 語句中不要使用強制索引關鍵字

MySql碎片相關知識

2.4.3 維護表結構

注意事項

  1. 使用在線變更表結構的工具
  2. 同時對數(shù)據(jù)庫字典進行維護
  3. 控制表的寬度和大小
    數(shù)據(jù)庫中適合的操作
  4. 批量操作,逐條操作都有,推薦使用批量操作
  5. 禁止使用Select *這樣的查詢
  6. 控制使用用戶自定義函數(shù)
  7. 不要使用數(shù)據(jù)庫中的全文索引

2.4.4 對表進行拆分

表的垂直拆分: 為了控制表的寬度可以進行表的垂直拆分
1.經(jīng)常一起查詢的列放到在一起
2.text,blob等大字段拆分到附加表中

表的水平拆分: 為了控制表的大小可以進行表的水平拆分

  1. 通過主鍵hash key的操作(按模取值)
  2. 時區(qū)段域拆分
  3. 表業(yè)務類型拆分

mysql分表的3種方法

2.4.5 其他

數(shù)據(jù)庫分區(qū):

  1. range分區(qū)
  2. list分區(qū)
  3. hash分區(qū)
  4. key分區(qū)
  5. 子分區(qū)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市醒第,隨后出現(xiàn)的幾起案子渔嚷,更是在濱河造成了極大的恐慌,老刑警劉巖稠曼,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件形病,死亡現(xiàn)場離奇詭異,居然都是意外死亡霞幅,警方通過查閱死者的電腦和手機漠吻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來司恳,“玉大人途乃,你說我怎么就攤上這事∪痈担” “怎么了耍共?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铅鲤。 經(jīng)常有香客問我划提,道長,這世上最難降的妖魔是什么邢享? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任鹏往,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘伊履。我一直安慰自己韩容,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布唐瀑。 她就那樣靜靜地躺著群凶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哄辣。 梳的紋絲不亂的頭發(fā)上请梢,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音力穗,去河邊找鬼毅弧。 笑死,一個胖子當著我的面吹牛当窗,可吹牛的內容都是我干的够坐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼崖面,長吁一口氣:“原來是場噩夢啊……” “哼元咙!你這毒婦竟也來了?” 一聲冷哼從身側響起巫员,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤庶香,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后疏遏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脉课,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡救军,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年财异,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唱遭。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡戳寸,死狀恐怖,靈堂內的尸體忽然破棺而出拷泽,到底是詐尸還是另有隱情疫鹊,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布司致,位于F島的核電站拆吆,受9級特大地震影響,放射性物質發(fā)生泄漏脂矫。R本人自食惡果不足惜枣耀,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庭再。 院中可真熱鬧捞奕,春花似錦牺堰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至院促,卻和暖如春筏养,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背常拓。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工撼玄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墩邀。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓掌猛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親眉睹。 傳聞我的和親對象是個殘疾皇子荔茬,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容