|
導(dǎo)讀數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)... 數(shù)據(jù)庫,簡而言之可視為電子化的文件柜——存儲(chǔ)電子文件的處所,用戶可以對(duì)文件中的數(shù)據(jù)進(jìn)行新增、截取、更新、刪除等操作。所謂“數(shù)據(jù)庫”是以一定方式儲(chǔ)存在一起、能與多個(gè)用戶共享、具有盡可能小的冗余度、與應(yīng)用程序彼此獨(dú)立的數(shù)據(jù)集合。 原標(biāo)題:淺談數(shù)據(jù)庫設(shè)計(jì)中的反規(guī)范 1. 摘要 本文從提高數(shù)據(jù)庫性能的角度,介紹了數(shù)據(jù)庫設(shè)計(jì)中幾種常用的反規(guī)范方法,并對(duì)這些方法的優(yōu)缺點(diǎn)以及使用時(shí)的注意事項(xiàng)做了較為深入的論述。 關(guān)鍵詞: 數(shù)據(jù)庫設(shè)計(jì) 反規(guī)范 提高性能 2. 數(shù)據(jù)庫設(shè)計(jì)簡述 數(shù)據(jù)庫設(shè)計(jì)是把現(xiàn)實(shí)世界的商業(yè)模型與需求轉(zhuǎn)換成數(shù)據(jù)庫的模型的過程,它是建立數(shù)據(jù)庫應(yīng)用系統(tǒng)的核心問題。設(shè)計(jì)的關(guān)鍵是如何使設(shè)計(jì)的數(shù)據(jù)庫能合理地存儲(chǔ)用戶的數(shù)據(jù),方便用戶進(jìn)行數(shù)據(jù)處理。 數(shù)據(jù)庫設(shè)計(jì)完全是人的問題,而不是數(shù)據(jù)庫管理系統(tǒng)的問題。系統(tǒng)不管設(shè)計(jì)是好是壞,照樣運(yùn)行。數(shù)據(jù)庫設(shè)計(jì)應(yīng)當(dāng)由數(shù)據(jù)庫管理員和系統(tǒng)分析員一起和用戶一道工作,了解各個(gè)用戶的要求,共同為整個(gè)數(shù)據(jù)庫做出恰當(dāng)?shù)摹⑼暾脑O(shè)計(jì)。 數(shù)據(jù)庫及其應(yīng)用的性能和調(diào)優(yōu)都是建立在良好的數(shù)據(jù)庫設(shè)計(jì)的基礎(chǔ)上,數(shù)據(jù)庫的數(shù)據(jù)是一切操作的基礎(chǔ),如果數(shù)據(jù)庫設(shè)計(jì)不好,則其它一切調(diào)優(yōu)方法提高數(shù)據(jù)庫性能的效果都是有限的。 數(shù)據(jù)的規(guī)范化 2.1. 范式概述 規(guī)范化理論是研究如何將一個(gè)不好的關(guān)系模式轉(zhuǎn)化為好的關(guān)系模式的理論,規(guī)范化理論是圍繞范式而建立的。規(guī)范化理論認(rèn)為,一個(gè)關(guān)系數(shù)據(jù)庫中所有的關(guān)系,都應(yīng)滿足一定的規(guī)范(約束條件)。規(guī)范化理論把關(guān)系應(yīng)滿足的規(guī)范要求分為幾級(jí),滿足最低要求的一級(jí)叫做第一范式(1NF),在第一范式的基礎(chǔ)上提出了第二范式(2NF),在第二范式的基礎(chǔ)上又提出了第三范式(3NF),以后又提出了BCNF范式,4NF,5NF。范式的等級(jí)越高,應(yīng)滿足的約束集條件也越嚴(yán)格。規(guī)范的每一級(jí)別都依賴于它的前一級(jí)別,例如若一個(gè)關(guān)系模式滿足2NF,則一定滿足1NF。下面我們只介紹1NF,2NF,3NF范式。 2.2. 1NF 1NF是關(guān)系模型的最低要求,它的規(guī)則是: 每一列必須是原子的,不能分成多個(gè)子列。 每一行和列的位置只能有一個(gè)值。 不能具有多值列。 例:如果要求一個(gè)學(xué)生一行,一個(gè)學(xué)生可選多門課,則下面的“學(xué)生”表就不滿足1NF: student(s-no,s-name,class-no) 其中:s-no為學(xué)號(hào),s-name為學(xué)生姓名,class-no為課程號(hào)。因?yàn)橐粋(gè)學(xué)生可選多門課,所以列class-no有多個(gè)值,所以空不符合1NF。 規(guī)范化就是把它分成如下兩個(gè)表:“學(xué)生”表和“選課”表,則這兩個(gè)表就都滿足1NF了。 student(s-no,s-name) stu-class(s-no,class-no) 2.3. 2NF 對(duì)于滿足2NF的表,除滿足1NF外,非主碼的列必須依賴于所有的主碼,而不是組合主碼的一部分。如果滿足1NF的表的主碼只有一列,則它自動(dòng)滿足2NF。 例:下面的“選課”表,不符合2NF。 stu-class(s-no,class-no,class-name) 其中:class-name為課程名稱。因?yàn)樵~表的主碼是:(s-no,class-no),非主碼列class-name依賴于組合主碼的一部分class-no,所以它不符合2NF。 對(duì)該表規(guī)范化也是把它分解成兩個(gè)表:“選課”表和“課程”表,則它們就都滿足2NF了。 stu-class(s-no,class-no) class(class-no,class-name) 2.4. 3NF 3NF的規(guī)則是除滿足2NF外,任一非主碼列不能依賴于其它非主碼列。 例:下面的“課程”表,不符合3NF。 class(class-no,class-name,teacher-no,teacher-name) 其中:teacher-no為任課教師號(hào),teacher-name為任課教師姓名。因?yàn)榉侵鞔a列teacher-name依賴于另一非主碼列teacher-no,所以它不符合3NF。 其解決辦法也是把它分解成兩個(gè)表:“課程”表和“教師”表,則它們就都滿足3NF了。 class(class-no,class-name,teacher-no) teacher(teacher-no,teacher-name) 2.5. 小結(jié) 當(dāng)一個(gè)表是規(guī)范的,則其非主碼列依賴于主碼列。從關(guān)系模型的角度來看,表滿足3NF最符合標(biāo)準(zhǔn),這樣的設(shè)計(jì)容易維護(hù)。一個(gè)完全規(guī)范化的設(shè)計(jì)并不總能生成最優(yōu)的性能,因此通常是先按照3NF設(shè)計(jì),如果有性能問題,再通過反規(guī)范來解決。 數(shù)據(jù)庫中的數(shù)據(jù)規(guī)范化的優(yōu)點(diǎn)是減少了數(shù)據(jù)冗余,節(jié)約了存儲(chǔ)空間,相應(yīng)邏輯和物理的I/O次數(shù)減少,同時(shí)加快了增、刪、改的速度,但是對(duì)完全規(guī)范的數(shù)據(jù)庫查詢,通常需要更多的連接操作,從而影響查詢的速度。因此,有時(shí)為了提高某些查詢或應(yīng)用的性能而破壞規(guī)范規(guī)則,即反規(guī)范。 3. 數(shù)據(jù)的反規(guī)范 3.1. 反規(guī)范的好處 是否規(guī)范化的程度越高越好?這要根據(jù)需要來決定,因?yàn)椤胺蛛x”越深,產(chǎn)生的關(guān)系越多,關(guān)系過多,連接操作越頻繁,而連接操作是最費(fèi)時(shí)間的,特別對(duì)以查詢?yōu)橹鞯臄?shù)據(jù)庫應(yīng)用來說,頻繁的連接會(huì)影響查詢速度。所以,關(guān)系有時(shí)故意保留成非規(guī)范化的,或者規(guī)范化以后又反規(guī)范了,這樣做通常是為了改進(jìn)性能。例如帳戶系統(tǒng)中的“帳戶”表B-TB01,它的列busi-balance(企業(yè)帳戶的總余額)就違反規(guī)范,其中的值可以通過下面的查詢獲得: select busi-code,sum(acc-balance) from B-TB06 group by busi-code 如果B-TB01中沒有該列,若想獲得busi-name(企業(yè)名稱)和企業(yè)帳戶的總余額,則需要做連接操作: select busi-name,sum(acc-balance) from B-TB01,B-TB06 where B-TB01.busi-code=B-TB06.busi-code group by busi-code 如果經(jīng)常做這種查詢,則就有必要在B-TB01中加入列busi-balance,相應(yīng)的代價(jià)則是必須在表B-TB06上創(chuàng)建增、刪、改的觸發(fā)器來維護(hù)B-TB01表上busi-balance列的值。類似的情況在決策支持系統(tǒng)中經(jīng)常發(fā)生。 反規(guī)范的好處是降低連接操作的需求、降低外碼和索引的數(shù)目,還可能減少表的數(shù)目,相應(yīng)帶來的問題是可能出現(xiàn)數(shù)據(jù)的完整性問題。加快查詢速度,但會(huì)降低修改速度。因此決定做反規(guī)范時(shí),一定要權(quán)衡利弊,仔細(xì)分析應(yīng)用的數(shù)據(jù)存取需求和實(shí)際的性能特點(diǎn),好的索引和其它方法經(jīng)常能夠解決性能問題,而不必采用反規(guī)范這種方法。 3.2. 常用的反規(guī)范技術(shù) 在進(jìn)行反規(guī)范操作之前,要充分考慮數(shù)據(jù)的存取需求、常用表的大小、一些特殊的計(jì)算(例如合計(jì))、數(shù)據(jù)的物理存儲(chǔ)位置等。常用的反規(guī)范技術(shù)有增加冗余列、增加派生列、重新組表和分割表。 3.2.1. 增加冗余列 增加冗余列是指在多個(gè)表中具有相同的列,它常用來在查詢時(shí)避免連接操作。例如前面例子中,如果經(jīng)常檢索一門課的任課教師姓名,則需要做class和teacher表的連接查詢: select class-name,teacher-name from class,teacher where class.teacher-no=teacher.teacher-no 這樣的話就可以在class表中增加一列teacher-name就不需要連接操作了。 增加冗余列可以在查詢時(shí)避免連接操作,但它需要更多的磁盤空間,同時(shí)增加表維護(hù)的工作量。 3.2.2. 增加派生列 增加派生列指增加的列來自其它表中的數(shù)據(jù),由它們計(jì)算生成。它的作用是在查詢時(shí)減少連接操作,避免使用集函數(shù)。例如前面所講的賬戶系統(tǒng)中的表B-TB01的列busi-balance就是派生列。派生列也具有與冗余列同樣的缺點(diǎn)。 3.2.3. 重新組表 重新組表指如果許多用戶需要查看兩個(gè)表連接出來的結(jié)果數(shù)據(jù),則把這兩個(gè)表重新組成一個(gè)表來減少連接而提高性能。例如,用戶經(jīng)常需要同時(shí)查看課程號(hào),課程名稱,任課教師號(hào),任課教師姓名,則可把表class(class-no,class-name,teacher-no)和表teacher(teacher-no,teacher-name)合并成一個(gè)表class(class-no,class-name,teacher-no,teacher-name)。這樣可提高性能,但需要更多的磁盤空間,同時(shí)也損失了數(shù)據(jù)在概念上的獨(dú)立性。 3.2.4. 分割表 有時(shí)對(duì)表做分割可以提高性能。表分割有兩種方式: 1水平分割:根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。 水平分割通常在下面的情況下使用:A 表很大,分割后可以降低在查詢時(shí)需要讀的數(shù)據(jù)和索引的頁數(shù),同時(shí)也降低了索引的層數(shù),提高查詢速度。B 表中的數(shù)據(jù)本來就有獨(dú)立性,例如表中分別記錄各個(gè)地區(qū)的數(shù)據(jù)或不同時(shí)期的數(shù)據(jù),特別是有些數(shù)據(jù)常用,而另外一些數(shù)據(jù)不常用。C 需要把數(shù)據(jù)存放到多個(gè)介質(zhì)上。 例如法規(guī)表law就可以分成兩個(gè)表active-law和inactive-law。activea-authors表中的內(nèi)容是正生效的法規(guī),是經(jīng)常使用的,而inactive-law表則使已經(jīng)作廢的法規(guī),不常被查詢。水平分割會(huì)給應(yīng)用增加復(fù)雜度,它通常在查詢時(shí)需要多個(gè)表名,查詢所有數(shù)據(jù)需要union操作。在許多數(shù)據(jù)庫應(yīng)用中,這種復(fù)雜性會(huì)超過它帶來的優(yōu)點(diǎn),因?yàn)橹灰饕P(guān)鍵字不大,則在索引用于查詢時(shí),表中增加兩到三倍數(shù)據(jù)量,查詢時(shí)也就增加讀一個(gè)索引層的磁盤次數(shù)。 2垂直分割:把主碼和一些列放到一個(gè)表,然后把主碼和另外的列放到另一個(gè)表中。如果一個(gè)表中某些列常用,而另外一些列不常用,則可以采用垂直分割,另外垂直分割可以使得數(shù)據(jù)行變小,一個(gè)數(shù)據(jù)頁就能存放更多的數(shù)據(jù),在查詢時(shí)就會(huì)減少I/O次數(shù)。其缺點(diǎn)是需要管理冗余列,查詢所有數(shù)據(jù)需要join操作。 4. 反規(guī)范技術(shù)需要維護(hù)數(shù)據(jù)的完整性 無論使用何種反規(guī)范技術(shù),都需要一定的管理來維護(hù)數(shù)據(jù)的完整性,常用的方法是批處理維護(hù)、應(yīng)用邏輯和觸發(fā)器。批處理維護(hù)是指對(duì)復(fù)制列或派生列的修改積累一定的時(shí)間后,運(yùn)行一批處理作業(yè)或存儲(chǔ)過程對(duì)復(fù)制或派生列進(jìn)行修改,這只能在對(duì)實(shí)時(shí)性要求不高的情況下使用。數(shù)據(jù)的完整性也可由應(yīng)用邏輯來實(shí)現(xiàn),這就要求必須在同一事務(wù)中對(duì)所有涉及的表進(jìn)行增、刪、改操作。用應(yīng)用邏輯來實(shí)現(xiàn)數(shù)據(jù)的完整性風(fēng)險(xiǎn)較大,因?yàn)橥贿壿嫳仨氃谒械膽?yīng)用中使用和維護(hù),容易遺漏,特別是在需求變化時(shí),不易于維護(hù)。另一種方式就是使用觸發(fā)器,對(duì)數(shù)據(jù)的任何修改立即觸發(fā)對(duì)復(fù)制列或派生列的相應(yīng)修改。觸發(fā)器是實(shí)時(shí)的,而且相應(yīng)的處理邏輯只在一個(gè)地方出現(xiàn),易于維護(hù)。一般來說,是解決這類問題的最好的辦法。 5. 結(jié)束語 數(shù)據(jù)庫的反規(guī)范設(shè)計(jì)可以提高查詢性能。常用的反規(guī)范技術(shù)有增加冗余列、增加派生列、重新組表和分割表。但反規(guī)范技術(shù)需要維護(hù)數(shù)據(jù)的完整性。因此在做反規(guī)范時(shí),一定要權(quán)衡利弊,仔細(xì)分析應(yīng)用的數(shù)據(jù)存取需求和實(shí)際的性能特點(diǎn)。 全新的路由器不僅讓你更穩(wěn)定快速地連接無線網(wǎng)絡(luò),更可以讓家中的智能設(shè)備連接在一起。 |
溫馨提示:喜歡本站的話,請收藏一下本站!