當前位置:首頁>新聞資訊>相關知識

大(dà)型ERP系統數據庫系統常見的(de)幾種設計方式

2014/4/26 20:45:35

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í)都要先查表名,再找數據,比較麻煩。


    舉例來(lái)說,早期的(de)用(yòng)友财務軟件用(yòng) Access 作數據庫,每年建立一個(gè)新的(de)數據庫。很快(kuài),用(yòng)戶和(hé)用(yòng)友公司都發現,跨年度數據分(fēn)析很難做(zuò)。因此這(zhè)是一個(gè)不好的(de)設計。在 ERP 中,很少有不同的(de)年度數據單獨分(fēn)開。一般來(lái)說,所有年份的(de)數據都在同一個(gè)表中。對(duì)于跨國公司甚至整個(gè)集團公司都用(yòng)同一個(gè) ERP 系統的(de)時(shí)候,所有公司的(de)數據都在一起。這(zhè)樣的(de)好處是數據分(fēn)析比較容易做(zuò)。
   
    現在大(dà)多(duō)數數據庫系統都能做(zuò)到在常數時(shí)間内返回一定量的(de)數據。比如,Oracle 數據庫中,根據 primary key 在 100萬條數據中取 10 條數據,與在1 億條數據中取 10 條數據,時(shí)間相差并不多(duō)。
   
    5. 避免一次取數據庫大(dà)量數據,取大(dà)量數據一定要用(yòng)分(fēn)頁。
   
    這(zhè)基本上是現在很多(duō)數據庫系統設計的(de)基本守則。ERP 系統中超過 100萬條數據的(de)表很多(duō),對(duì)于很多(duō)表中的(de)任何一個(gè),一次取所有的(de)會導緻數據庫服務器長(cháng)時(shí)間處于停滞狀态,并且影(yǐng)響其它在線用(yòng)戶的(de)系統響應速度。
   
    一般來(lái)說,日常操作,在分(fēn)頁顯示的(de)情況下(xià)面,每次取得(de)數據在 1-100 之間,系統響應速度足夠快(kuài),客戶端基本沒有特别長(cháng)的(de)停頓。這(zhè)是比較理(lǐ)想的(de)設計。這(zhè)也(yě)是大(dà)型數據庫系統往往用(yòng) ODBC, ADO 等等通(tōng)用(yòng)的(de)數據庫聯接組件而不用(yòng)特定的(de)速度較快(kuài)的(de)專用(yòng)數據庫聯接組件的(de)原因。因爲系統瓶頸在于數據庫( Database) 方面(數據量大(dà)),而不在于客戶端(客戶端每次隻取少量數據)。
   
    在 B/S 數據庫系統中,分(fēn)頁非常普遍。早期的(de)數據庫系統經常有客戶端程序中一次性取大(dà)量數據做(zuò)緩沖。現在已經不是特别需要了(le),主要原因有:
   
    5.1 數據庫本身的(de)緩沖技術大(dà)大(dà)提高(gāo)。
   
    大(dà)部分(fēn)數據庫都會自動将常用(yòng)的(de)數據自動放在内存中緩沖,以提高(gāo)性能。
   
    5.2 數據庫聯接組件的(de)緩沖技術也(yě)在提高(gāo)。
   
    包括 ADO 在内的(de)一些數據庫聯接組件都會自動對(duì)數據結果集(result set)進行緩沖,并且效果不錯。比較新穎的(de)數據庫聯接組件,比如 Hibernate 也(yě)加入了(le)一些數據結果集緩沖功能。
   
    當然,也(yě)有一些數據庫聯接組件沒有對(duì)數據結果集進行緩沖,比如 JDBC Driver,不過幾年之内情況應該有所改觀。也(yě)有些不太成功的(de)數據緩沖,比如 EJB 中的(de)實體Bean,性能就不盡如人(rén)意,實體Bean數據也(yě)是放在内存中,可(kě)能是因爲占用(yòng)内存過多(duō)的(de)緣故。
   
    相對(duì)來(lái)說,今天的(de)程序員(yuán)寫客戶端數據緩沖,能夠超過以上兩個(gè)緩沖效果的(de),已經比較難了(le)。