• 2

資料庫正規化與反正規化使用時機

今天跟同事討論金流處理的設計,在資料庫方面有認知上的不同。

1.我偏向DB自動產生流水號當唯一鍵和做索引,訂單編號另外產生,同事想用程式產日期加流水號當唯一鍵,順便當訂單編號
2.我想將子公司這個分類拆成另一張表來關聯,所以有兩張表,同事認為我過度正規化,認為在編號上用A、B表示即可。

在想我是否太堅持使用正規化,所以去查查網路上對於反正規化的看法,其實連我主管也認為正規化是學校再教的。

對於一般生命週期短的活動專案,個人是同意不用正規化,因為效率優先,而且也不用多花工。
但在設計金流處理方面,總覺得要有個正規化,因為以後的活動都會使用到這功能,所以我是以系統的角度來思考。

因為我跟同事還有主管都不是DBA的專長,所以想請教各位在這種專案上會傾向怎麼處理。
2015-03-19 21:15 發佈
文章關鍵字 資料庫
資料庫的正規化,雖然在撈資料較慢,但對以後的維護及修改較方便。

反正規化資料庫,會讓後續接手的人看不懂
jo87fish wrote:今天跟同事討論金流處理的設計,在資料庫方...(恕刪)


連SAP很多資料庫都不是走高度正規化,
一切還是以business為主,
不要被正規化限制了設計。
我怎麼覺得你同事的說法才是正規化的方式,如果你的訂單編號是唯一不會重覆,那就當KEY阿,為何還要弄個流水號?
如果訂單編號會重覆,或是訂單編號是可以變更的,你的做法就是正確的...
一般一階正規化要做比較好...

第2點,其實多個欄位紀錄就好,不需要另用資料表,但也不要像你同事說的那樣...
我怎麼覺得你同事的說法才是正規化的方式,如果你的訂單編號是唯一不會重覆,那就當KEY阿,為何還要弄個流水號?

想法是mysql 自動產流水號與索引,一直覺得這樣比用訂單編號來做 join與查詢上有效率,想說流水號是給電腦使用,訂單編號是給人來辨識使用,不知是我認識有誤。

如果訂單編號會重覆,或是訂單編號是可以變更的,你的做法就是正確的...一般一階正規化要做比較好...

訂單號碼不會重複,只是不了解這對資料正確與JOIN、索引是否會影響到效能,雖然分表處理不好也是降低效能...

第2點,其實多個欄位紀錄就好,不需要另用資料表,但也不要像你同事說的那樣...

多個欄位,就會覺得那可以記錄成數字1,2,3,那這樣就可以順便一張表,看要不要順便join秀出1,2,3是哪幾間公司
個人是覺得這樣設計有點怪,流水號如果是有實質上作用的例如憑證啥的,那沒問題,可是照你的說法,應該是不會用到流水號來查詢吧,這樣你就會多需要使用訂單編號來做index,流水號跟訂單編號來做JOIN都一樣,沒有啥效率好壞...除非你型態不同

第2點如果你的訂單會同時屬於多家子公司(應該不太可能),才會這樣設計吧,同一張表直接用條件篩選肯定比JOIN來得有效率阿..

總之,沒有什麼太大的對錯之分,完全取決於你的原始需求是什麼...不過就你的說明看來,用訂單編號當KEY、多個欄位紀錄子公司,應該是最適宜的作法...
流水號是整數,而訂單編號通常是字串型態
這兩者處理速度上以流水號較快

因此可以考慮每個資料表都是用流水號做key來關連
訂單編號這種長字串只儲存在某一個資料表即可
~^_^~
Wallace Wang wrote:
流水號是整數,而訂單編號通常是字串型態
這兩者處理速度上以流水號較快
因此可以考慮每個資料表都是用流水號做key來關連
訂單編號這種長字串只儲存在某一個資料表即可


千萬不要這樣做, 除非產業是retail 或是資料量極大的產業,
( 或是要用結構化的DB處理非結構化的資料 )
否則流水號做序號是沒有意義的事情,
對未來系統擴充也會帶來限制.

DB/AP執行效率雖然很重要,
但不是做系統擺第一的因素, Business考量才是要擺在最前面的.
redial wrote:
千萬不要這樣做, 除...(恕刪)


同意

除非該系統打算用上二三十年

而且可能會有上億筆資料



真要效能好 還是直接提升硬體比較實在

用自動編號的流水號來當key 還要多一張表來紀錄跟串連

只是把程式設計師撈資料的動作弄得很複雜

而且 如果記錄的表出現問題 那資料要修復我想應該頗有難度



另外一題

本來我有客戶買E3的伺服器主機 硬碟是用原廠配的500G硬碟做RAID1

跑MSSQL 記憶體是8G 配給資料庫的記憶體配6G

客戶反應跑資料下整年度非常慢 (筆數大概十五萬筆左右)

第一點是AP沒寫好 沒有預先把所需要的資料表日期區間範圍先LOAD下來在本機再串報表

而是打上一大串的SELECT語法去串十幾張資料表然後計算加總等等的...

一下指令整台伺服器 CPU馬上飆到100% 直接影響到其他使用者

因為AP沒辦法要求廠商修改

於是最後將RAM升級到16G 500G硬碟換成240G SSD

本來跑一年資料要影響所有使用者大概45分鐘

換SSD之後 縮減剩下10分鐘就跑完了

SSD萬歲~





jo87fish wrote:
今天跟同事討論金流...(恕刪)
貓老闆

kahnmao wrote:
於是最後將RAM升級到16G 500G硬碟換成240G SSD
本來跑一年資料要影響所有使用者大概45分鐘
換SSD之後 縮減剩下10分鐘就跑完了
SSD萬歲~


恭喜解決問題, 換成SSD + RAID可以大幅提升硬體效能,

這也是很多大型商用軟體廠商( SAP/Oracle/微軟 ) 目前投下大量研發能力要走的路: In Memory Computing

希望在現有AP上的Business 架構及程式不改變或是少量改變下, 提升DB或是AP Server的效能.

  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?