以下是針對事務型資料庫:
1.是否使用聯合主鍵?個人傾向於少採用聯合主鍵。因為這樣會降低索引的效率,聯合主鍵一般都要用到至少乙個業務字段,往往是字串型的,而且理論上多字段的索引比單字段的索引要慢些。看上去似乎也不那麼清爽。
在實際的設計中,我盡量避免使用聯合主鍵,有些時候「不得不」使用聯合主鍵。
2.pk採用無意義的字段(邏輯主鍵)還是有意義的字段(業務主鍵)?個人傾向於「邏輯主鍵」,理由是這樣設計出的資料庫模型結構清晰、關係脈絡清楚,往往更符合「第三正規化」(雖然不是故意的,呵呵)。而且更容易避開「聯合主鍵」,而且可以使用索引效率高的字段型別,比如int、long、number。缺點是用無意義的字段建立表間的關係,使跨表查詢增多,效率下降。(矛盾無處不在,前面剛說完可以提高效率,這裡馬上又降低效率)。「業務主鍵」可以提公升查詢編碼的簡潔度和效率。
個人使用實際狀況,總體來說「邏輯主鍵」比「業務主鍵」執行效率低,但不會低到無法滿足需求。採用「邏輯主鍵」比採用「業務主鍵」更利於資料庫模型的結構、關係清晰,也更便於維護。
對於分析型資料庫,如資料倉儲,千萬不要這樣做。
3.不要使用多對多關係?個人傾向於少使用多對多關係。這個問題其實不是資料庫設計的問題了,在資料庫設計中,多對多關係也僅僅存在於概念模型(e-r)階段,物理模型不在有多對多關係,實際資料庫中也不會有「多對多」關係。這是使用orm時的問題,比如使用hibernate,多對多關係有時會使編碼看起來靈活一些,代價是效率的明顯降低。
個人實際使用中,設計時基本不考慮多對多關係,但編碼時總會有小組成員使用一些多對多關係,自己建立多對多的orm,使自己編碼方便些,用在資料量小的地方,影響不大。大資料量,則「禁止使用」。
4.為每個表增加乙個state欄位?我習慣在設計時給每個表設乙個state欄位,取值0或1,預設值為1,具體業務意義或操作上的意義可以自定義。可以作為乙個狀態控制字段,如查詢、更新、刪除條件,單據是否有效(業務單據對應的表會有業務意義上的「有/無效」或「狀態」字段,這種情況下,我還是會再加乙個state欄位),甚至僅僅是控制一條資料是否「有效」(有效的意義你自己定)。在資料遷移(如轉入分析用的資料庫)時也可能會發揮作用。
5.為每個表設定一些備用字段?沒辦法,我總是設計不出「完美」的資料表,給每個表加幾個備用字段(我一般用字串型,隨你)可以應付「不時之需」,尤其是需要長期維護的、業務可能有臨時性變動的系統。
6.盡量不要在乙個表中存入其關聯表的字段?建議不存!這樣做確實可以提高查詢效率,但在乙個有很多表,並且關聯表多的情況下,很難保持資料的一致性!資料庫結構也比較糟糕。而且不存,也不會使效率十分低下。
7.不要去直接修改資料庫?個人認為這點很重要,當需要修改時,應該先去修改模型,然後同步物理資料庫,尤其是團隊開發,否則要多做更多的事情來搞定,也可能會引入更多的錯誤。
資料庫設計的一些有效經驗
以下是針對事務型資料庫 1.是否使用聯合主鍵?個人傾向於少採用聯合主鍵。因為這樣會降低索引的效率,聯合主鍵一般都要用到至少乙個業務字段,往往是字串型的,而且理論上多字段的索引比單字段的索引要慢些。看上去似乎也不那麼清爽。在實際的設計中,我盡量避免使用聯合主鍵,有些時候 不得不 使用聯合主鍵。2.pk...
關於資料庫設計的一些經驗
資料庫設計的三大正規化 第一正規化 1st nf 第一正規化的目標是確保每列的原子性 如果每列都是不可再分的最小資料單元 也稱為最小的原子單元 則滿足第一正規化 1nf 第二正規化 2nd nf 如果乙個關係滿足1nf,並且除了主鍵以外的其他列,都依賴與該主鍵,則滿足第二正規化 2nf 第二正規化要...
資料庫 庫表設計 分享一些庫表設計經驗
本文的核心內容 記錄積累一些庫表設計方案與技巧 資料庫表的選單 分類 設計 如省市關聯 圖書的 一 二級分類。資料庫表設計之購物車,利用session暫時儲存購物車資訊。booktype 一級分類 少兒 外語 計算機 bookclass 二級分類 少兒 0 2歲 3 6歲 7 10歲 11 14歲 ...