針對事務型資料庫設計小結

2021-04-07 13:08:42 字數 1356 閱讀 9229

1.是否使用聯合主鍵?個人傾向於少採用聯合主鍵。因為這樣會降低索引的效率,聯合主鍵一般都要用到至少乙個業務字段,往往是字串型的,而且理論上多字段的索引比單字段的索引要慢些。看上去似乎也不那麼清爽。 

在實際的設計中,我盡量避免使用聯合主鍵,有些時候「不得不」使用聯合主鍵。 

2.pk採用無意義的字段(邏輯主鍵)還是有意義的字段(業務主鍵)?個人傾向於「邏輯主鍵」,理由是這樣設計出的資料庫模型結構清晰、關係脈絡清楚,往往更符合「第三正規化」(雖然不是故意的,呵呵)。而且更容易避開「聯合主鍵」,而且可以使用索引效率高的字段型別,比如int、long、number。缺點是用無意義的字段建立表間的關係,使跨表查詢增多,效率下降。(矛盾無處不在,前面剛說完可以提高效率,這裡馬上又降低效率)。「業務主鍵」可以提公升查詢編碼的簡潔度和效率。 

個人使用實際狀況,總體來說「邏輯主鍵」比「業務主鍵」執行效率低,但不會低到無法滿足需求。採用「邏輯主鍵」比採用「業務主鍵」更利於資料庫模型的結構、關係清晰,也更便於維護。 

對於分析型資料庫,如資料倉儲,千萬不要這樣做。 

3.不要使用多對多關係?個人傾向於少使用多對多關係。這個問題其實不是資料庫設計的問題了,在資料庫設計中,多對多關係也僅僅存在於邏輯模型(e-r)階段,物理模型不在有多對多關係,實際資料庫中也不會有「多對多」關係。這是使用orm時的問題,比如使用hibernate,多對多關係有時會使編碼看起來靈活一些,代價是效率的明顯降低。 

個人實際使用中,設計時基本不考慮多對多關係,但編碼時總會有小組成員使用一些多對多關係,自己建立多對多的orm,使自己編碼方便些,用在資料量小的地方,影響不大。大資料量,則「禁止使用」。 

4.為每個表增加乙個state欄位?我習慣在設計時給每個表設乙個state欄位,取值0或1,預設值為1,具體業務意義或操作上的意義可以自定義。可以作為乙個狀態控制字段,如查詢、更新、刪除條件,單據是否有效(業務單據對應的表會有業務意義上的「有/無效」或「狀態」字段,這種情況下,我還是會再加乙個state欄位),甚至僅僅是控制一條資料是否「有效」(有效的意義你自己定)。在資料遷移(如轉入分析用的資料庫)時也可能會發揮作用。 

5.為每個表設定一些備用字段?沒辦法,我總是設計不出「完美」的資料表,給每個表加幾個備用字段(我一般用字串型,隨你)可以應付「不時之需」,尤其是需要長期維護的、業務可能有臨時性變動的系統。 

6.盡量不要在乙個表中存入其關聯表的字段?建議不存!這樣做確實可以提高查詢效率,但在乙個有很多表,並且關聯表多的情況下,很難保持資料的一致性!資料庫結構也比較糟糕。而且不存,也不會使效率十分低下。 

7.不要去直接修改資料庫?個人認為這點很重要,當需要修改時,應該先去修改模型,然後同步物理資料庫,尤其是團隊開發,否則要多做更多的事情來搞定,也可能會引入更多的錯誤

8:每個表加 建立記錄時間,建立記錄人,修改記錄時間,修改記錄人 四個欄位的

事務型資料庫設計經驗

以下是針對事務型資料庫設計經驗 1.資料庫設計經驗之是否使用聯合主鍵?個人傾向於少採用聯合主鍵。因為這樣會降低索引的效率,聯合主鍵一般都要用到至少乙個業務字段,往往是字串型的,而且理論上多字段的索引比單字段的索引要慢些。看上去似乎也不那麼清爽。在實際的設計中,我盡量避免使用聯合主鍵,有些時候 不得不...

關係型資料庫設計

1.五級正規化 一般滿足 即可 第一正規化的定義 如果乙個表中沒有重複組 即行與列的交叉點上只有乙個值,而不是一組值,例如 姓名 性別 字段,但 愛好 欄位不符合1nf 且定義了關鍵字 所有非關鍵屬性都依賴於關鍵字,則這個表屬於第一正規化 常記成1nf 第二正規化的定義 如果乙個表屬於1nf,且不包...

專案小結 資料庫設計

資料庫表的設計,可以按物件和按功能載體劃分。如記錄該物件哪些屬性,然後就需要哪些字段。但是表的設計不能只考慮物件的單一性,因為表中肯定需要儲存多個該物件,所以需要考慮附加屬性,如時間,時間一般包括錄入時間和執行時間。在人員記錄時,不僅要記錄業務邏輯處理者,同時應該記錄錄入該資訊的人員名稱。多表之間的...