數據庫設計過程中不僅要考慮遵循第三範式,還要考慮是否冗餘
很多數據庫設計書籍都強調數據庫設計三範式,而三範式的一個重要工作就是消除冗餘,可以消除冗餘在大多數情況下是正確的。當在實際的業務模型中,處理複雜的業務時有時冗餘某些信息是更好的。
一、業務需求
值班排班業務:
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生成的邏輯結構轉換成物理結構
數據庫的設計並不是一成不變,需要結合實際業務場景進行靈活的變化