![數(shù)據(jù)庫設計11個原則_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/4829064e-9696-4b5d-9e7a-9ec2c816acec/4829064e-9696-4b5d-9e7a-9ec2c816acec1.gif)
![數(shù)據(jù)庫設計11個原則_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/4829064e-9696-4b5d-9e7a-9ec2c816acec/4829064e-9696-4b5d-9e7a-9ec2c816acec2.gif)
![數(shù)據(jù)庫設計11個原則_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/4829064e-9696-4b5d-9e7a-9ec2c816acec/4829064e-9696-4b5d-9e7a-9ec2c816acec3.gif)
![數(shù)據(jù)庫設計11個原則_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/4829064e-9696-4b5d-9e7a-9ec2c816acec/4829064e-9696-4b5d-9e7a-9ec2c816acec4.gif)
![數(shù)據(jù)庫設計11個原則_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/4829064e-9696-4b5d-9e7a-9ec2c816acec/4829064e-9696-4b5d-9e7a-9ec2c816acec5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、簡介在您開始閱讀這篇文章之前,我得明確地告訴您,我并不是一個數(shù)據(jù)庫設計領域的大師。以下列出的 11 點是我對自己在平時項目實踐和閱讀中學習到的經(jīng)驗總結出來的個人見解。我個人認為它們對我的數(shù)據(jù)庫設計提供了很大的幫助。實屬一家之言,歡迎拍磚 : )我之所以寫下這篇這么完整的文章是因為,很多開發(fā)者一參與到數(shù)據(jù)庫設計,就會很自然地把 “三范式” 當作銀彈一樣來使用。他們往往認為遵循這個規(guī)范就是數(shù)據(jù)庫設計的唯一標準。由于這種心態(tài),他們往往盡管一路碰壁也會堅持把項目做下去。如果你對 “三范式” 不清楚,請點擊這里(FQ)一步一步的了解什么是“三范式”。大家都說標準規(guī)范是重要的指導方針并且也這么做著,但是把
2、它當作石頭上的一塊標記來記著(死記硬背)還是會帶來麻煩的。以下 11 點是我在數(shù)據(jù)庫設計時最優(yōu)先考慮的規(guī)則。規(guī)則 1:弄清楚將要開發(fā)的應用程序是什么性質(zhì)的(OLTP 還是 OPAP)?當你要開始設計一個數(shù)據(jù)庫的時候,你應該首先要分析出你為之設計的應用程序是什么類型的,它是 “事務處理型”(Transactional) 的還是 “分析型” (Analytical)的?你會發(fā)現(xiàn)許多開發(fā)人員采用標準化做法去設計數(shù)據(jù)庫,而不考慮目標程序是什么類型的,這樣做出來的程序很快就會陷入性能、客戶定制化的問題當中。正如前面所說的,這里有兩種應用程序類型, “基于事務處理” 和 “基于分析”,下面讓我們來了解一下
3、這兩種類型究竟說的是什么意思。事務處理型:這種類型的應用程序,你的最終用戶更關注數(shù)據(jù)的增查改刪(CRUD,Creating/Reading/Updating/Deleting)。這種類型更加官方的叫法是 “OLTP” 。分析型:這種類型的應用程序,你的最終用戶更關注數(shù)據(jù)分析、報表、趨勢預測等等功能。這一類的數(shù)據(jù)庫的 “插入” 和 “更新” 操作相對來說是比較少的。它們主要的目的是更加快速地查詢、分析數(shù)據(jù)。這種類型更加官方的叫法是 “OLAP” 。那么換句話說,如果你認為插入、更新、刪除數(shù)據(jù)這些操作在你的程序中更為突出的話,那就設計一個規(guī)范化的表否則的話就去創(chuàng)建一個扁平的、不規(guī)范化的數(shù)據(jù)庫結構。
4、以下這個簡單的圖表顯示了像左邊 Names 和 Address 這樣的簡單規(guī)范化的表,怎么通過應用不規(guī)范化結構來創(chuàng)建一個扁平的表結構。規(guī)則 2:將你的數(shù)據(jù)按照邏輯意義分成不同的塊,讓事情做起來更簡單這個規(guī)則其實就是 “三范式” 中的第一范式。違反這條規(guī)則的一個標志就是,你的查詢使用了很多字符串解析函數(shù)例如 substring、charindex 等等。若真如此,那就需要應用這條規(guī)則了。比如你看到的下面圖片上有一個有學生名字的表,如果你想要查詢學生名字中包含“Koirala”,但不包含“Harisingh”的記錄,你可以想象一下你將會得到什么樣的結果。所以更好的做法是將這個字段拆分為更深層次的邏
5、輯分塊,以便我們的表數(shù)據(jù)寫起來更干凈,以及優(yōu)化查詢。規(guī)則 3:不要過度使用 “規(guī)則 2”開發(fā)者都是一群很可愛的生物。如果你告訴他們這是一條解決問題的正路,他們就會一直這么做下去,做到過了頭導致了一些不必要的后果。這也可以應用于我們剛剛在前面提到的規(guī)則2。當你考慮字段分解時,先暫停一下,并且問問你自己是否真的需要這么做。正如所說的,分解應該是要符合邏輯的。例如,你可以看到電話號碼這個字段,你很少會把電話號碼的 ISD 代碼單獨分開來操作(除非你的應用程序要求這么做)。所以一個很明智的決定就是讓它保持原樣,否則這會帶來更多的問題。規(guī)則 4:把重復、不統(tǒng)一的數(shù)據(jù)當成你最大的敵人來對待集中那些重復的數(shù)
6、據(jù)然后重構它們。我個人更加擔心的是這些重復數(shù)據(jù)帶來的混亂而不是它們占用了多少磁盤空間。例如下面這個圖表,你可以看到 “5th Standard” 和 “Fifth standard” 是一樣的意思,它們是重復數(shù)據(jù)?,F(xiàn)在你可能會說是由于那些錄入者錄入了這些重復的數(shù)據(jù)或者是差勁的驗證程序沒有攔住,讓這些重復的數(shù)據(jù)進入到了你的系統(tǒng)?,F(xiàn)在,如果你想導出一份將原本在用戶眼里十分困惑的數(shù)據(jù)顯示為不同實體數(shù)據(jù)的報告,該怎么做呢?解決方法之一是將這些數(shù)據(jù)完整地移到另外一個主表,然后通過外鍵引用過來。在下面這個圖表中你可以看到我們是如何創(chuàng)建一個名為 “Standards”(課程級別) 的主表,然后同樣地使用簡單
7、的外鍵連接過去。規(guī)則 5:當心被分隔符分割的數(shù)據(jù),它們違反了“字段不可再分”前面的規(guī)則 2 即“第一范式”說的是避免 “重復組” 。下面這個圖表作為其中的一個例子解釋了 “重復組”是什么樣子的。如果你仔細的觀察 syllabus(課程) 這個字段,會發(fā)現(xiàn)在這一個字段里實在是填充了太多的數(shù)據(jù)了。像這些字段就被稱為 “重復組” 了。如果我們又得必須使用這些數(shù)據(jù),那么這些查詢將會十分復雜并且我也懷疑這些查詢會有性能問題。這些被塞滿了分隔符的數(shù)據(jù)列需要特別注意,并且一個較好的辦法是將這些字段移到另外一個表中,使用外鍵連接過去,同樣地以便于更好的管理。那么,讓我們現(xiàn)在就應用規(guī)則2(第一范式) “避免重復
8、組” 吧。你可以看到上面這個圖表,我創(chuàng)建了一個單獨的 syllabus(課程) 表,然后使用 “多對多” 關系將它與 subject(科目) 表關聯(lián)起來。通過這個方法,主表(student 表)的 syllabus(課程) 字段就不再有重復數(shù)據(jù)和分隔符了。規(guī)則 6:當心那些僅僅部分依賴主鍵的列留心注意那些僅僅部分依賴主鍵的列。例如上面這個圖表,我們可以看到這個表的主鍵是 Roll No.+Standard?,F(xiàn)在請仔細觀察 syllabus 字段,可以看到 syllabus(課程) 字段僅僅關聯(lián)(依賴) Standard(課程級別) 字段而不是直接地關聯(lián)(依賴)某個學生(Roll No. 字段)
9、。Syllabus(課程) 字段關聯(lián)的是學生正在學習的哪個課程級別(Standard 字段)而不是直接關聯(lián)到學生本身。那如果明天我們要更新教學大綱(課程)的話還要痛苦地為每個同學也修改一下,這明顯是不符合邏輯的(不正常的做法)。更有意義的做法是將這些字段從這個表移到另外一個表,然后將它們與 Standard(課程級別)表關聯(lián)起來。你可以看到我們是如何移動 syllabus(課程)字段并且同樣地附上 Standard 表。這條規(guī)則只不過是 “三范式” 里的 “第二范式”:“所有字段都必須完整地依賴主鍵而不是部分依賴”。規(guī)則 7:仔細地選擇派生列如果你正在開發(fā)一個 OLTP 型
10、的應用程序,那強制不去使用派生字段會是一個很好的思路,除非有迫切的性能要求,比如經(jīng)常需要求和、計算的 OLAP 程序,為了性能,這些派生字段就有必要存在了。通過上面的這個圖表,你可以看到 Average 字段是如何依賴 Marks 和 Subjects 字段的。這也是冗余的一種形式。因此對于這樣的由其他字段得到的字段,需要思考一下它們是否真的有必要存在。這個規(guī)則也被稱為 “三范式” 里的第三條:“不應該有依賴于非主鍵的列” 。 我的個人看法是不要盲目地運用這條規(guī)則,應該要看實際情況,冗余數(shù)據(jù)并不總是壞的。如果冗余數(shù)據(jù)是計算出來的,看看實際情況再來決定是否應用這第三范式。規(guī)則
11、 8:如果性能是關鍵,不要固執(zhí)地去避免冗余不要把 “避免冗余” 當作是一條絕對的規(guī)則去遵循。如果對性能有迫切的需求,考慮一下打破常規(guī)。常規(guī)情況下你需要做多個表的連接操作,而在非常規(guī)的情況下這樣的多表連接是會大大地降低性能的。規(guī)則 9:多維數(shù)據(jù)是各種不同數(shù)據(jù)的聚合OLAP 項目主要是解決多維數(shù)據(jù)問題。比如你可以看看下面這個圖表,你會想拿到每個國家、每個顧客、每段時期的銷售額情況。簡單的說你正在看的銷售額數(shù)據(jù)包含了三個維度的交叉。為這種情況做一個實際的設計是一個更好的辦法。簡單的說,你可以創(chuàng)建一個簡單的主要銷售表,它包含了銷售額字段,通過外鍵將其他所有不同維度的表連接起來。規(guī)則 10:將那些具有“名值表”特點的表統(tǒng)一起來設計很多次我都遇到過這種 “名值表” 。 “名值表” 意味著它有一些鍵,這些鍵被其他數(shù)據(jù)關聯(lián)著。比如下面這個圖表,你可以看到我們有 Currency(貨幣型)和 Country(國家)這兩張表。如果你仔細觀察你會發(fā)現(xiàn)實際上這些表都只有鍵和值。對于這種表,創(chuàng)建一個主要的表,通過一個 Type(類型)字段來區(qū)分不同的數(shù)據(jù)將會更有意義。規(guī)則 11:無限分級結構的數(shù)據(jù),引用自己的主鍵作為外鍵我們會經(jīng)常碰到
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- idc租賃服務合同范例
- 存貨質(zhì)押合同范本
- 企業(yè)員工招聘合同范本
- 農(nóng)村安裝路燈合同范例
- 兼職配音協(xié)議合同范本
- 照明燈具采購合同范本
- 工業(yè)固體廢物處置合同范本
- 冰箱保養(yǎng)合同范本
- 天籟侗歌苗寨傳
- 2025年度國際知識產(chǎn)權轉讓合同范本(含專利保護)
- 施工周報表(標準模版)
- 4.5MWp分布式光伏項目主要設備材料清單(建筑工程安裝工程)
- von frey絲K值表完整版
- 云南省普通初中學生成長記錄模板-好ok
- SB/T 10415-2007雞粉調(diào)味料
- 考古繪圖基礎
- GB/T 32574-2016抽水蓄能電站檢修導則
- 《社會主義市場經(jīng)濟理論(第三版)》第十三章社會主義市場經(jīng)濟標準論
- 變更索賠案例分析
- 過敏性休克的急救及處理流程教材課件(28張)
- 《花婆婆》兒童繪本故事
評論
0/150
提交評論