數據庫設計那些事兒
目的: 有效的存儲,高效的訪問。
優良的設計特點
- 減少數據冗余,2. 避免數據異常,3. 節約存儲空間,4. 高效的數據訪問
數據庫設計步驟
1.需求分析,2.邏輯設計ER建模,3.物理設計(Mysql、Oracle、Sql server),4.維護優化(新需求建表、索引優化、大表拆分)。
需求分析
搞清楚實體與實體之間的關系?
實體包含哪些屬性?
實體的唯一標識是什麽?
對於日誌類的實體,可以進行分庫分表設計,定期歸檔。
電商實例,用戶模塊、商品模塊、訂單模塊、購物車模塊、供應商模塊。
用戶模塊,包含屬性:用戶名、密碼、電話、郵箱、身份證號、地址、姓名、昵稱...
可選唯一標識,用戶名、身份證、電話、郵箱。
存儲特點,隨系統上線逐漸增加,需要永久存儲。
商品模塊,包含屬性:商品編碼、商品名稱、商品描述、商品分類、供應商名稱、價格
可選唯一標識(商品編碼)、(商品名稱、供應商名稱)
存儲特點:對於下線商品可以歸檔存儲(不要刪除)。
訂單模塊,包括屬性:訂單號、用戶姓名、電話、收貨地址、商品編號、商品名稱、數量、價格、訂單狀態、支付狀態、訂單類型...
可用唯一標識,訂單號。
存儲特點:永久存儲(分庫分表)
購物車模塊,包括屬性:用戶名、商品編號、商品名稱、商品價格,商品分類,加入時間,商品數量...
可選唯一標識:(用戶名、商品編號、加入時間)、(購物車編號)
存儲特點:不用永久存儲(設置歸檔,清理規則)
供應商模塊,包括屬性:供應商編號、供應商名稱、聯系人、電話、營業執照號、地址、法人...
可選唯一標識:供應商編號、營業執照號
存儲特點:永久存儲。
邏輯設計
矩形表示實體集
菱形表示聯系集
橢圓表示實體屬性
線段連接屬性與實體,實體與聯系集
遵循一二三範式就基本夠用了,遵循它可以有效的避免數據庫操作異常及數據冗余。
第一範式(1NF),字段不可拆分。表中的每個字段都是最小的數據單元
下面的設計就不符合第一範式。
第二範式(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麽這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。在 1NF 的基礎上,表中所有的非碼屬性必須【完全依賴】於候選碼,不可以部分依賴
存在部分依賴主屬性。
商品價格與重量,有效期,分類,依賴於商品。
供應商電話,依賴於供應商名稱。
拆分成3個表。商品表,供應商表,供應商與商品關聯表。
或者拆分成2個表。商品表,供應商表。商品表關聯供應商表。
第三範式(3NF),就是不能重復存儲相同的信息。在 2NF 的基礎上,非主屬性之間沒有相互依賴(消除傳遞依賴)
分類描述與分類存在傳遞依賴。
拆分成商品表,分類表。通過分類id來關聯分類。
BC範式(BCNF)復合關鍵字之間也不能存在函數依賴關系
拆成供應商,供應商聯系人
商品ID、供應商聯系人,商品數量
物理設計
選擇合適的數據庫管理系統,Mysql 、Oracle、Sql Server。
建立數據庫、表以及命名規範。
根據所選的DBMS,選擇合適的字段類型。
反範式化設計,冗余,以空間換時間。
尊徐可讀原則、表意原則、長名原則。下面的表命名就不可取。
對於日期,優先,int,datetime,char ,varchar。
避免使用外鍵約束,影響高並發。(降低導入效率,增加維護成本)。
避免使用觸發器(可能出現數據異常,業務邏輯變復雜)。
反範式,以空間換時間,適用於高並發項目。
減少表關聯數量
增加讀取效率
反範式化要適度適量
維護優化
維護數據字典(特別是狀態字段),增加備註
維護索引(增加索引,優化索引)
表結構優化
水平拆分,垂直拆分表
經常查的放在一個表中。不常用,大字段的放到另一張表。(垂直拆分),解決表寬度大問題。
通過hash來實現水平拆分。解決數據量大問題。
具體的設計,還要根據業務進行分析。盡量設計出合適的表。好的底層,才能蓋出牢固的大樓。後期維護的時候,也盡量遵守設計步驟和原則。讓系統有條不紊的提升。
數據庫設計那些事兒