1. 自增長(cháng) primary key
采用(yòng)自增長(cháng) primary key主要是性能。早期的(de)數據庫系統,經常采用(yòng)某種編号,比如身份證号碼,公司編号等等作爲數據庫表的(de) primary key。然而,很快(kuài),大(dà)家就發現其中的(de)不利之處。
比如早期的(de)醫院管理(lǐ)系統,用(yòng)身份證号碼作爲病人(rén)表的(de) primary key。然而,第一,不是每個(gè)人(rén)都有身份證;第二,對(duì)于國外來(lái)的(de)病人(rén),不同國家的(de)病人(rén)的(de)證件号碼并不見得(de)沒有重複。因此,用(yòng)身份證号碼作爲病人(rén)表的(de) primary key是一個(gè)非常糟糕的(de)設計。考慮到沒有醫生或者護士會刻意去記這(zhè)些号碼,使用(yòng)自增長(cháng) primary key是更好的(de)設計。
公司編号采用(yòng)某種特定的(de)編碼方法,這(zhè)也(yě)是早期的(de)數據庫系統常見的(de)做(zuò)法。它的(de)缺點也(yě)顯而易見:很容易出現像千年蟲的(de)軟件問題,因爲當初設計數據庫表的(de)時(shí)候設計的(de)位數太短,導緻系統使用(yòng)幾年後不能滿足要求,隻有修改程序才能繼續使用(yòng)。問題在于,任何人(rén)設計系統的(de)時(shí)候,在預計某某編号多(duō)少位可(kě)以夠用(yòng)的(de)時(shí)候,都存在預計不準的(de)風險。而采用(yòng)自增長(cháng) primary key 則不存在這(zhè)種問題。同樣的(de)道理(lǐ),沒有人(rén)可(kě)以去記這(zhè)些号碼。
使用(yòng)自增長(cháng) primary key另外一個(gè)原因是性能問題。略有編程常識的(de)人(rén)都知道,數字大(dà)小比較比字符串大(dà)小比較要快(kuài)得(de)多(duō)。使用(yòng)自增長(cháng) primary key可(kě)以大(dà)大(dà)地提高(gāo)數據查找速度。
2. 避免用(yòng)複合主鍵 (compound primary key)
這(zhè)主要還(hái)是因爲性能問題。數據檢索是要用(yòng)到大(dà)量的(de) primary key 值比較,隻比較一個(gè)字段比比較多(duō)個(gè)字段快(kuài)很多(duō)。使用(yòng)單個(gè) primary key 從編程的(de)角度也(yě)很有好處, sql 語句中 where 條件可(kě)以寫更少的(de)代碼,這(zhè)意味著(zhe)出錯的(de)機會大(dà)大(dà)減少。
3. 雙主鍵
雙主鍵是指數據庫表有兩個(gè)字段,這(zhè)兩個(gè)字段獨立成爲主鍵,但又同時(shí)存在。 數據庫系統的(de)雙主鍵最早用(yòng)在用(yòng)戶管理(lǐ)模塊。最早的(de)來(lái)源可(kě)能是參照(zhào)操作系統的(de)用(yòng)戶管理(lǐ)模塊。
操作系統的(de)用(yòng)戶管理(lǐ)有兩個(gè)獨立的(de)主鍵:操作系統自己自動生成的(de)随機 ID (Linux, windows 的(de) SID), login id。這(zhè)兩個(gè) ID 都必須是唯一的(de),不同的(de)是,删除用(yòng)戶 test 然後增加一個(gè)用(yòng)戶 test, SID 不同,login id 相同。采用(yòng)雙主鍵主要目的(de)是爲了(le)防止删除後增加同樣的(de) login id 造成的(de)混亂。比如銷售經理(lǐ) hellen 本機共享文件給總經理(lǐ) peter, 一年後總經理(lǐ)離開公司,進來(lái)一個(gè)普通(tōng)員(yuán)工 peter ,兩個(gè)peter 用(yòng)同樣的(de) login id, 如果隻用(yòng) login id 作操作系統的(de)用(yòng)戶管理(lǐ)主鍵,則存在漏洞:普通(tōng)員(yuán)工 peter 可(kě)以訪問原來(lái)隻有總經理(lǐ)才能看的(de)文件。操作系統自己自動生成的(de)随機 ID 一般情況下(xià)面用(yòng)戶是看不到的(de)。
雙主鍵現在已經廣泛用(yòng)在各種數據庫系統中,不限于用(yòng)戶管理(lǐ)系統。
4. 以固定的(de)數據庫、表應付變化(huà)的(de)客戶需求
這(zhè)主要基于以下(xià)幾個(gè)因素的(de)考慮:
4.1 大(dà)型 EPR 系統的(de)正常使用(yòng)、維護需要軟件廠商及其衆多(duō)的(de)合作夥伴共同給客戶提供技術服務,包括大(dà)量的(de)二次開發。
如果用(yòng)戶在軟件正常使用(yòng)過程中需要增加新的(de)表或者數據庫,将給軟件廠商及其衆多(duō)的(de)合作夥伴帶來(lái)難題。
4.2 軟件升級的(de)需要。
沒有一個(gè)軟件能夠讓客戶使用(yòng)幾十上百年不用(yòng)升級的(de)。軟件升級往往涉及數據庫表結構的(de)改變。軟件廠商會做(zuò)額外的(de)程序将早期版本軟件的(de)數據庫數據升級到新的(de)版本,但是對(duì)于用(yòng)戶使用(yòng)過程中生成的(de)表進行處理(lǐ)就比較爲難。
4.3 軟件開發的(de)需要。
使用(yòng)固定的(de)數據庫庫表從開發、二次開發來(lái)說,更加容易。對(duì)于用(yòng)戶使用(yòng)過程中生成的(de)表,每次查找數據時(shí)都要先查表名,再找數據,比較麻煩。