跳到主要內容

資料庫欄位設計與正規化

我也沒想到,工作十幾年之後,居然還要寫這樣的題目。資料庫正規化設計,在21世紀的今天,應該早就是攻城獅(工程師)耳熟能詳的必備項目,沒想到還有人用20世紀的思維在設計,因此稍稍抒發小弟我不滿的情緒。
首先,一般人設計資料表時,應該做到第三正規化,請參考微軟的資料庫正規化基本概念,若想知道更多正規化細節可以參考WiKi的資料庫正規化

那為什麼會產生反正規化的設計呢?最常見的情況是Data Warehouse,為了要把所需的資料都放在同一個table不要做太多層的Join/Sub Query以增快查詢速度。

現在,要來提30年前的可怕反正規化設計方式,早期在VAX時代,敝公司的人事系統,把職級代碼與職稱代碼放在同一個table,超過50為界限。這在查詢時真是宇宙無敵麻煩,沒想到MIS先生在改版時還follow這設計...

另一個20年前的反正規化設計,為了寫程式時的方便不要寫複雜的SQL查詢與Join,把多筆資料放在同一個欄位,用逗號分隔。舉例來說,有人訂了雞腿飯(代碼1),欄位值就是1,若再訂了排骨飯(代碼2),欄位值變成『1,2』。在介面上呈現時,由他的程式去判斷有幾筆訂單。

這時就有人會說,這樣很好呀!省空間又快。鄉民程序員醒醒吧,現在最流行什麼?
大平台大數據呀!想一想,把這種資料丟到BI工具時會怎麼樣?沒有辦法自動Join,所以需要手動去拆解這樣的反正規化欄位,光是BI的Function就會寫到想砍人,訂便當的例子可能要DBA去展開訂單資料另外建table才能分析...

所以,孩子,普通的CRUD系統就乖乖地導守古人的智慧做第三正規化吧!

留言

匿名表示…
你們公司都找原始人當員工嗎?

這個網誌中的熱門文章

自然人憑證讀卡機驅動程式

鳥毅用的是第一代的自然人憑證讀卡機,EZ100PU(後來有同事買EZmini可以讀SIM卡似乎更好),每年報稅時用一次。

本來只是要申請些政府業務,一時之間找不到光碟,沒想到在驅動程式下載居然看到Linux和Mac的驅動程式,剩下的就是政府單位的網頁和程式應該改版了吧!!!

在Windows Server設定L2TP over IPSec VPN

簡單地說,macOS Sierra與iOS 10發表後,大家忽然發現Apple不再支援PPTP,所以一定得設定其他的VPN型態。若不要另外裝client,用L2TP是最方便的,SSL VPN雖然好,但若沒有安裝Agent要連線到任一電腦或是非網頁服務還是挺麻煩的。