數據庫設計包含需求設計、邏輯設計、物理設計和維護優化。數據庫
爲了設計出沒有數據冗餘和數據維護異常的數據結構,咱們須要遵循如下規範:安全
針對這個問題,咱們怎麼破呢?咱們對上面這個表拆分爲3個表:學生表、課程表、學生課程關係表。其中,學生表和課程表只有一個主鍵,而學生課程關係表有一個複合主鍵(學生編號,課程),分數徹底依賴於這個複合主鍵,所以符合第二範式。 bash
每個非主屬性既不部分依賴於也不傳遞依賴於業務主鍵,也就是在第二範式的基礎上消除了非主屬性對主鍵的傳遞依賴。 對於學生表,學院依賴於學生編號,而學院地址卻依賴於學院,這就是傳遞依賴,此時,這張表不知足第三範式。若是想讓這張表知足第三範式就須要繼續對這張表進行拆分。 微信
遵循範式化的數據庫設計,實現了消除數據冗餘的目的,可是此時數據庫的性能和讀取效率並非最優的。爲了性能和讀取效率的考慮而適當的對數據庫設計範式的要求進行違反,而容許存在少許的數據冗餘,換句話來講反範式化就是使用空間來換取時間。 舉個栗子,以咱們常常進行下單爲例。根據範式準則,定單表和訂單商品關聯表以下:數據結構
訂單表:{訂單編號,下單用戶名,下單日期,支付金額,物流單號}
訂單商品關聯表:{訂單編號,訂單商品分類,訂單商品名,商品數量}
複製代碼
咱們知道查詢訂單時,每每須要知道用戶名稱和用戶手機號,那麼,此時咱們就須要將訂單表和用戶表進行關聯查詢。這種設計存在一個問題,當用戶修改手機號,那麼用舊手機號買的訂單號的手機信息是新的手機號,而不是舊手機號,這是不符合業務需求的。解決這個問題的辦法就是將用戶名和用戶手機號加入到訂單表中。一樣狀況,商品的價格也存在修改的狀況,所以,也須要將支付金額加入到訂單表中,此時,訂單表和訂單商品關聯表以下:數據庫設計
訂單表:{訂單編號,下單用戶名,下單日期,支付金額,物流單號,訂單金額}
訂單商品關聯表:{訂單編號,訂單商品分類,訂單商品名,商品數量,商品單價}
複製代碼
歡迎關注微信公衆號:木可大大,全部文章都將同步在公衆號上。性能