如何在數據庫三範式的基礎上進行數據庫冗餘設計

數據庫設計過程中不僅要考慮遵循第三範式,還要考慮是否冗餘

很多數據庫設計書籍都強調數據庫設計三範式,而三範式的一個重要工作就是消除冗餘,可以消除冗餘在大多數情況下是正確的。當在實際的業務模型中,處理複雜的業務時有時冗餘某些信息是更好的。

一、業務需求

值班排班業務:
1、可以設置值班人員;
2、可以設置值班班次;
3、可以進行值班編排;

二、概念結構設計

1、需求分析;

(略過)

2、畫用例圖;

progress(略過)

3、畫E-R圖:

1)、定義實體:組織成員、值班成員、班次、排班
2)、組織成員是組織中的全部成員
3)、值班成員依賴於組織成員
4)、排班依賴於班次和值班成員
5)、當前時間已經超過給值班人員排的班次的值班時間時,排班記錄自動成爲排班歷史記錄

簡單寫一下幾個實體中的屬性
值班成員 shift_contactor_setting(id,…)
班次 shift_setting(id,time,…);
排班 shift_arrange(id,shift_setting_id,shift_contactor_setting_id,date,…)

首先是滿足了第三範式,都是我們繼續看,當排班記錄成爲歷史時,排班記錄應該是不可變的。都是由於我們的排班表是依賴於班次表的,當修改班次記錄時,排班歷史也可能關聯變化了
這裏考慮兩種解決辦法:

第一種

把班次的time冗餘到排班表中: shift_arrange(id,shift_setting_id,shift_contactor_setting_id,date,time…)
新增排班時將班次表的time賦值給排班表的time

第二種

不做冗餘,而是每次修改班次時,將舊的班次邏輯刪除,然後增加一條新的班次記錄;然後還需要將當前時間小於排班的時間的排班記錄(也就是未成爲歷史記錄的排班記錄)關聯的班次id設置爲新的班次id,而已經成爲排班歷史記錄的排班記錄不作處理
查詢時,需要顯示排班記錄中關聯的被邏輯刪除的班次

可以看出,第二種方式雖然沒有任何冗餘,都是增加了代碼上的操作,更爲複雜,所以這種場景更適合設計冗餘字段

三、邏輯結構設計

powerDesigner

四、物理結構設計

MySQL或者將powerDesigner生成的邏輯結構轉換成物理結構


數據庫的設計並不是一成不變,需要結合實際業務場景進行靈活的變化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章