精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

寫給開發(fā)者看的關(guān)系型數(shù)據(jù)庫設(shè)計

數(shù)據(jù)庫 數(shù)據(jù)庫運維
數(shù)據(jù)庫設(shè)計,一個軟件項目成功的基石。很多從業(yè)人員都認為,數(shù)據(jù)庫設(shè)計其實不那么重要。現(xiàn)實中的情景也相當(dāng)雷同,開發(fā)人員的數(shù)量是數(shù)據(jù)庫設(shè)計人員的數(shù)倍。多數(shù)人使用數(shù)據(jù)庫中的一部分,所以也會把數(shù)據(jù)庫設(shè)計想的如此簡單。其實不然,數(shù)據(jù)庫設(shè)計也是門學(xué)問。

數(shù)據(jù)庫設(shè)計,一個軟件項目成功的基石。很多從業(yè)人員都認為,數(shù)據(jù)庫設(shè)計其實不那么重要。現(xiàn)實中的情景也相當(dāng)雷同,開發(fā)人員的數(shù)量是數(shù)據(jù)庫設(shè)計人員的數(shù)倍。多數(shù)人使用數(shù)據(jù)庫中的一部分,所以也會把數(shù)據(jù)庫設(shè)計想的如此簡單。其實不然,數(shù)據(jù)庫設(shè)計也是門學(xué)問。

從筆者的經(jīng)歷看來,筆者更贊成在項目早期由開發(fā)者進行數(shù)據(jù)庫設(shè)計(后期調(diào)優(yōu)需要DBA)。根據(jù)筆者的項目經(jīng)驗,一個精通OOP和ORM的開發(fā)者,設(shè)計的數(shù)據(jù)庫往往更為合理,更能適應(yīng)需求的變化,如果追其原因,筆者個人猜測是因為數(shù)據(jù)庫的規(guī)范化,與OO的部分思想雷同(如內(nèi)聚)。而DBA,設(shè)計的數(shù)據(jù)庫的優(yōu)勢是能將DBMS的能力發(fā)揮到極致,能夠使用SQL和DBMS實現(xiàn)很多程序?qū)崿F(xiàn)的邏輯,與開發(fā)者相比,DBA優(yōu)化過的數(shù)據(jù)庫更為高效和穩(wěn)定。如標(biāo)題所示,本文旨在分享一名開發(fā)者的數(shù)據(jù)庫設(shè)計經(jīng)驗,并不涉及復(fù)雜的SQL語句或 DBMS使用,因此也不會局限到某種DBMS產(chǎn)品上。真切地希望這篇文章對開發(fā)者能有所幫助,也希望讀者能幫助筆者查漏補缺。

一 Codd的RDBMS12法則——RDBMS的起源

Edgar Frank Codd(埃德加·弗蘭克·科德)被譽為“關(guān)系數(shù)據(jù)庫之父”,并因為在數(shù)據(jù)庫管理系統(tǒng)的理論和實踐方面的杰出貢獻于1981年獲圖靈獎。在1985 年,Codd 博士發(fā)布了12條規(guī)則,這些規(guī)則簡明的定義出一個關(guān)系型數(shù)據(jù)庫的理念,它們被作為所有關(guān)系數(shù)據(jù)庫系統(tǒng)的設(shè)計指導(dǎo)性方針。

  1. 信息法則 關(guān)系數(shù)據(jù)庫中的所有信息都用唯一的一種方式表示——表中的值。
  2. 保證訪問法則 依靠表名、主鍵值和列名的組合,保證能訪問每個數(shù)據(jù)項。
  3. 空值的系統(tǒng)化處理 支持空值(NULL),以系統(tǒng)化的方式處理空值,空值不依賴于數(shù)據(jù)類型。
  4. 基于關(guān)系模型的動態(tài)聯(lián)機目錄 數(shù)據(jù)庫的描述應(yīng)該是自描述的,在邏輯級別上和普通數(shù)據(jù)采用同樣的表示方式,即數(shù)據(jù)庫必須含有描述該數(shù)據(jù)庫結(jié)構(gòu)的系統(tǒng)表或者數(shù)據(jù)庫描述信息應(yīng)該包含在用戶可以訪問的表中。
  5. 統(tǒng)一的數(shù)據(jù)子語言法則 一個關(guān)系數(shù)據(jù)庫系統(tǒng)可以支持幾種語言和多種終端使用方式,但必須至少有一種語言,它的語句能夠一某種定義良好的語法表示為字符串,并能全面地支持以下所有規(guī)則:數(shù)據(jù)定義、視圖定義、數(shù)據(jù)操作、約束、授權(quán)以及事務(wù)。(這種語言就是SQL)
  6. 視圖更新法則 所有理論上可以更新的視圖也可以由系統(tǒng)更新。
  7. 高級的插入、更新和刪除操作 把一個基礎(chǔ)關(guān)系或派生關(guān)系作為單個操作對象處理的能力不僅適應(yīng)于數(shù)據(jù)的檢索,還適用于數(shù)據(jù)的插入、修改個刪除,即在插入、修改和刪除操作中數(shù)據(jù)行被視作集合。
  8. 數(shù)據(jù)的物理獨立性 不管數(shù)據(jù)庫的數(shù)據(jù)在存儲表示或訪問方式上怎么變化,應(yīng)用程序和終端活動都保持著邏輯上的不變性。
  9. 數(shù)據(jù)的邏輯獨立性 當(dāng)對表做了理論上不會損害信息的改變時,應(yīng)用程序和終端活動都會保持邏輯上的不變性。
  10. 數(shù)據(jù)完整性的獨立性 專用于某個關(guān)系型數(shù)據(jù)庫的完整性約束必須可以用關(guān)系數(shù)據(jù)庫子語言定義,而且可以存儲在數(shù)據(jù)目錄中,而非程序中。
  11. 分布獨立性 不管數(shù)據(jù)在物理是否分布式存儲,或者任何時候改變分布策略,RDBMS的數(shù)據(jù)操縱子語言必須能使應(yīng)用程序和終端活動保持邏輯上的不變性。
  12. 非破壞性法則 如果一個關(guān)系數(shù)據(jù)庫系統(tǒng)支持某種低級(一次處理單個記錄)語言,那么這個低級語言不能違反或繞過更高級語言(一次處理多個記錄)規(guī)定的完整性法則或約束,即用戶不能以任何方式違反數(shù)據(jù)庫的約束。

二 關(guān)系型數(shù)據(jù)庫設(shè)計階段

(一)規(guī)劃階段

規(guī)劃階段的主要工作是對數(shù)據(jù)庫的必要性和可行性進行分析。確定是否需要使用數(shù)據(jù)庫,使用哪種類型的數(shù)據(jù)庫,使用哪個數(shù)據(jù)庫產(chǎn)品。

(二)概念階段

概念階段的主要工作是收集并分析需求。識別需求,主要是識別數(shù)據(jù)實體和業(yè)務(wù)規(guī)則。對于一個系統(tǒng)來說,數(shù)據(jù)庫的主要包括業(yè)務(wù)數(shù)據(jù)和非業(yè)務(wù)數(shù)據(jù),而業(yè)務(wù)數(shù)據(jù)的定義,則依賴于在此階段對用戶需求的分析。需要盡量識別業(yè)務(wù)實體和業(yè)務(wù)規(guī)則,對系統(tǒng)的整體有初步的認識,并理解數(shù)據(jù)的流動過程。理論上,該階段將參考或產(chǎn)出多種文檔,比如“用例圖”,“數(shù)據(jù)流圖”以及其他一些項目文檔。如果能夠在該階段產(chǎn)出這些成果,無疑將會對后期進行莫大的幫助。當(dāng)然,很多文檔已超出數(shù)據(jù)庫設(shè)計者的考慮范圍。而且,如果你并不精通該領(lǐng)域以及用戶的業(yè)務(wù),那么請放棄自己獨立完成用戶需求分析的想法。用戶并不是技術(shù)專家,而當(dāng)你自身不能扮演“業(yè)務(wù)顧問”的角色時,請你選擇與項目組的相關(guān)人員合作,或者將其視為風(fēng)險呈報給PM。再次強調(diào),大多數(shù)情況,用戶只是行業(yè)從業(yè)者,而非職業(yè)技術(shù)人員,我們僅僅從用戶那里收集需求,而非依賴于用戶的知識。

記錄用戶需求時,可以使用一些技巧,當(dāng)然這部分內(nèi)容有些可能會超出數(shù)據(jù)庫設(shè)計人員的職責(zé):

  • 努力維護一系列包含了系統(tǒng)設(shè)計和規(guī)格說明信息的文檔,如會議記錄、訪談記錄、關(guān)鍵用戶期望、功能規(guī)格、技術(shù)規(guī)格、測試規(guī)格等。
  • 頻繁與干系人溝通并收集反饋。
  • 標(biāo)記出你自己添加的,不屬于客戶要求的,未決內(nèi)容。
  • 與所有關(guān)鍵干系人盡快確認項目范圍,并力求凍結(jié)需求。

此外,必須嚴(yán)謹(jǐn)處理業(yè)務(wù)規(guī)則,并詳細記錄。在之后的階段,將會根據(jù)這些業(yè)務(wù)規(guī)則進行設(shè)計。

當(dāng)該階段結(jié)束時,你應(yīng)該能夠回答以下問題:

  • 需要哪些數(shù)據(jù)?
  • 數(shù)據(jù)該被怎樣使用?
  • 哪些規(guī)則控制著數(shù)據(jù)的使用?
  • 誰會使用何種數(shù)據(jù)?
  • 客戶想在核心功能界面或者報表上看到哪些內(nèi)容?
  • 數(shù)據(jù)現(xiàn)在在哪里?
  • 數(shù)據(jù)是否與其他系統(tǒng)有交互、集成或同步?
  • 主題數(shù)據(jù)有哪些?
  • 核心數(shù)據(jù)價值幾何,對可靠性的要求程度?

并且得到如下信息:

  • 實體和關(guān)系
  • 屬性和域
  • 可以在數(shù)據(jù)庫中強制執(zhí)行的業(yè)務(wù)規(guī)則
  • 需要使用數(shù)據(jù)庫的業(yè)務(wù)過程

(三)邏輯階段

邏輯階段的主要工作是繪制E-R圖,或者說是建模。建模工具很多,有不同的圖形表示方法和軟件。這些工具和軟件的使用并非關(guān)鍵,筆者也不建議讀者花大量時間在建模方法的選擇上。對于大多數(shù)應(yīng)用來說,E-R圖足以描述實體間的關(guān)系。建模關(guān)鍵是思想而不是工具,軟件只是起到輔助作用,識別實體關(guān)系才是本階段的重點。

除了實體關(guān)系,我們還應(yīng)該考慮屬性的域(值類型、范圍、約束)

(四)實現(xiàn)階段

實現(xiàn)階段主要針對選擇的RDBMS定義E-R圖對應(yīng)的表,考慮屬性類型和范圍以及約束。

(五)物理階段

物理階段是一個驗證并調(diào)優(yōu)的階段,是在實際物理設(shè)備上部署數(shù)據(jù)庫,并進行測試和調(diào)優(yōu)。

#p#

三 設(shè)計原則

(一)降低對數(shù)據(jù)庫功能的依賴

功能應(yīng)該由程序?qū)崿F(xiàn),而非DB實現(xiàn)。原因在于,如果功能由DB實現(xiàn)時,一旦更換的DBMS不如之前的系統(tǒng)強大,不能實現(xiàn)某些功能,這時我們將不得不去修改代碼。所以,為了杜絕此類情況的發(fā)生,功能應(yīng)該有程序?qū)崿F(xiàn),數(shù)據(jù)庫僅僅負責(zé)數(shù)據(jù)的存儲,以達到最低的耦合。

(二)定義實體關(guān)系的原則

當(dāng)定義一個實體與其他實體之間的關(guān)系時,需要考量如下:

  • 牽涉到的實體 識別出關(guān)系所涉及的所有實體。
  • 所有權(quán) 考慮一個實體“擁有”另一個實體的情況。
  • 基數(shù) 考量一個實體的實例和另一個實體實例關(guān)聯(lián)的數(shù)量。

關(guān)系與表數(shù)量

  • 描述1:1關(guān)系最少需要1張表。
  • 描述1:n關(guān)系最少需要2張表。
  • 描述n:n關(guān)系最少需要3張表。

(三)列意味著唯一的值

如果表示坐標(biāo)(0,0),應(yīng)該使用兩列表示,而不是將“0,0”放在1個列中。

(四)列的順序

列的順序?qū)τ诒韥碚f無關(guān)緊要,但是從習(xí)慣上來說,采用“主鍵+外鍵+實體數(shù)據(jù)+非實體數(shù)據(jù)”這樣的順序?qū)α羞M行排序顯然能得到比較好的可讀性。

(五)定義主鍵和外鍵

數(shù)據(jù)表必須定義主鍵和外鍵(如果有外鍵)。定義主鍵和外鍵不僅是RDBMS的要求,同時也是開發(fā)的要求。幾乎所有的代碼生成器都需要這些信息來生成常用方法的代碼(包括SQL文和引用),所以,定義主鍵和外鍵在開發(fā)階段是必須的。之所以說在開發(fā)階段是必須的是因為,有不少團隊出于性能考慮會在進行大量測試后,在保證參照完整性不會出現(xiàn)大的缺陷后,會刪除掉DB的所有外鍵,以達到最優(yōu)性能。筆者認為,在性能沒有出現(xiàn)問題時應(yīng)該保留外鍵,而即便性能真的出現(xiàn)問題,也應(yīng)該對SQL文進行優(yōu)化,而非放棄外鍵約束。

(六)選擇鍵

1 人工鍵與自然鍵

人工健——實體的非自然屬性,根據(jù)需要由人強加的,如GUID,其對實體毫無意義;自然健——實體的自然屬性,如身份證編號。

人工鍵的好處:

  • 鍵值永遠不變
  • 永遠是單列存儲

人工鍵的缺點:

  • 因為人工鍵是沒有實際意義的唯一值,所以不能通過人工鍵來避免重復(fù)行。

筆者建議全部使用人工鍵。原因如下:

  • 在設(shè)計階段我們無法預(yù)測到代碼真正需要的值,所以干脆放棄猜測鍵,而使用人工鍵。
  • 人工鍵復(fù)雜處理實體關(guān)系,而不負責(zé)任何屬性描述,這樣的設(shè)計使得實體關(guān)系與實體內(nèi)容得到高度解耦,這樣做的設(shè)計思路更加清晰。

筆者的另一個建議是——每張表都需要有一個對用戶而言有意義的自然鍵,在特殊情況下也許找不到這樣一個項,此時可以使用復(fù)合鍵。這個鍵我在程序中并不會使用其作為唯一標(biāo)識,但是卻可以在對數(shù)據(jù)庫直接進行查詢時使用。

使用人工鍵的另一根弊端,主要源自對查詢性能的考量,因此選擇人工鍵的形式(列的類型)很重要:

  • 自增值類型 由于類型輕巧查詢效率更好,但取值有限。
  • GUID 查詢效率不如值類型,但是取值無限,且對開發(fā)人員更加親切。

2 智能健與非智能鍵

智能鍵——鍵值包含額外信息,其根據(jù)某種約定好的編碼規(guī)范進行編碼,從鍵值本身可以獲取某些信息;非智能鍵,單純的無意義鍵值,如自增的數(shù)字或GUID。

智能鍵是一把雙刃劍,開發(fā)人員偏愛這種包含信息的鍵值,程序盼望著其中潛在的數(shù)據(jù);數(shù)據(jù)庫管理員或者設(shè)計者則討厭這種智能鍵,原因也是很顯然的,智能鍵對數(shù)據(jù)庫是潛在的風(fēng)險。前面提到,數(shù)據(jù)庫設(shè)計的原則之一是不要把具有獨立意義的值的組合實現(xiàn)到一個單一的列中,應(yīng)該使用多個獨立的列。數(shù)據(jù)庫設(shè)計者,更希望開發(fā)人員通過拼接多個列來得到智能鍵,即以復(fù)合主鍵的形式給開發(fā)人員使用,而不是將一個列的值分解后使用。開發(fā)人員應(yīng)該接受這種數(shù)據(jù)庫設(shè)計,但是很多開發(fā)者卻想不明白兩者的優(yōu)略。筆者認為,使用單一列實現(xiàn)智能鍵存在這樣一個風(fēng)險,就是我們可能在設(shè)計階段無法預(yù)期到編碼規(guī)則可能會在后期發(fā)生變化。比如,構(gòu)成智能鍵的局部鍵的值用完而引起規(guī)則變化或者長度變化,這種編碼規(guī)則的變化對于程序的有效性驗證與智能鍵解析是破壞性的,這是系統(tǒng)運維人員最不希望看到的。所以筆者建議如果需要智能鍵,請在業(yè)務(wù)邏輯層封裝(使用只讀屬性),不要再持久化層實現(xiàn),以避免上述問題。

(七)是否允許NULL

關(guān)于NULL我們需要了解它的幾個特性:

  • 任何值和NULL拼接后都為NULL。
  • 所有與NULL進行的數(shù)學(xué)操作都返回NULL。
  • 引入NULL后,邏輯不易處理。

那么我們是否應(yīng)該允許列為空呢?筆者認為這個問題的答案受到我們的開發(fā)語言的影響。以C#為例,因為引入了可空類型來處理數(shù)據(jù)庫值類型為NULL的情形,所以是否允許為空對開發(fā)者來說意義并不大。但有一點必須注意,就是驗證非空必須要在程序集進行處理,而不該依賴于DBMS的非空約束,必須確保完整數(shù)據(jù)(所有必須的屬性均被賦值)到達DB(所謂的“安全區(qū)”,我們必須定義在多層系統(tǒng)中那些區(qū)域得到的數(shù)據(jù)是安全而純凈的)。

(八)屬性切割

一種錯誤想法是,屬性與列是1:1的關(guān)系。對于開發(fā)者,我們公開屬性而非字段。舉個例子來說,對于實體“員工”有“名字”這一屬性,“名字”可以再被分解為“姓”和“名”,對于開發(fā)人員來說,顯然第二種數(shù)據(jù)結(jié)構(gòu)更受青睞(“姓” 和“名”作為兩個字段)。所以,在設(shè)計時我們也應(yīng)該根據(jù)需要考慮是否切割屬性。

#p#

(九)規(guī)范化——范式

當(dāng)筆者還在大學(xué)時,范式是學(xué)習(xí)關(guān)系型數(shù)據(jù)庫時最頭疼的問題。我想也許會有讀者仍然不理解范式的價值,簡單來說——范式將幫助我們來保證數(shù)據(jù)的有效性和完整性。規(guī)范化的目的如下:

  • 消滅重復(fù)數(shù)據(jù)。
  • 避免編寫不必要的,用來使重復(fù)數(shù)據(jù)同步的代碼。
  • 保持表的瘦身,以及減從一張表中讀取數(shù)據(jù)時需要進行的讀操作數(shù)量。
  • 最大化聚集索引的使用,從而可以進行更優(yōu)化的數(shù)據(jù)訪問和聯(lián)結(jié)。
  • 減少每張表使用的索引數(shù)量,因為維護索引的成本很高。

規(guī)范化旨在——挑出復(fù)雜的實體,從中抽取出簡單的實體。這個過程一直持續(xù)下去,直到數(shù)據(jù)庫中每個表都只代表一件事物,并且表中每個描述的都是這件事物為止。

1 規(guī)范化實體和屬性(去除冗余)

1NF:每個屬性都只應(yīng)表示一個單一的值,而非多個值。

需要考慮幾點:

  • 屬性是原子性的 需要考慮熟悉是否分解的足夠徹底,使得每個屬性都表示一個單一的值。(和“(三)列意味著唯一的值”描述的原則相同。)分解原則為——當(dāng)你需要分開處理每個部分時才分解值,并且分解到足夠用就行。(即使當(dāng)前不需要徹底分解屬性,也應(yīng)該考慮未來可能的需求變更。)
  • 屬性的所有實例必須包含相同數(shù)量的值 實體有固定數(shù)量的屬性(表有固定數(shù)量的列)。設(shè)計實體時,要讓每個屬性只有固定數(shù)量的值與其相關(guān)聯(lián)。
  • 實體中出現(xiàn)的所有實體類型都必須不同

當(dāng)前設(shè)計不符合1NF的“臭味”:

  • 包含分隔符類字符的字符串?dāng)?shù)據(jù)。
  • 名字尾端有數(shù)字的屬性。
  • 沒有定義鍵或鍵定義不好的表。

2 屬性間的關(guān)系(去除冗余)

2NF-實體必須符合1NF,每個屬性描述的東西都必須針對整個鍵(可以理解為oop中類型屬性的內(nèi)聚性)。

當(dāng)前設(shè)計不符合2NF的“臭味”:

  • 重復(fù)的鍵屬性名字前綴(設(shè)計之外的數(shù)據(jù)冗余) 表明這些值可能描述了某些額外的實體。
  • 有重復(fù)的數(shù)據(jù)組(設(shè)計之外的數(shù)據(jù)冗余) 這標(biāo)志著屬性間有函數(shù)依賴型。
  • 沒有外鍵的復(fù)合主鍵 這標(biāo)志著鍵中的鍵值可能標(biāo)識了多種事物,而不是一種事物。

3NF-實體必須符合2NF,非鍵屬性不能描述其他非鍵屬性。(與2NF不同,3NF處理的是非鍵屬性和非鍵屬性之間的關(guān)系,而不是和鍵屬性之間的關(guān)系。

當(dāng)前設(shè)計不符合3NF的“臭味”:

  • 多個屬性有同樣的前綴。
  • 重復(fù)的數(shù)據(jù)組。
  • 匯總的數(shù)據(jù),所引用的數(shù)據(jù)在一個完全不同的實體中。(有些人傾向于使用視圖,我更傾向于使用對象集合,即由程序來完成。)

BCNF-實體滿足第一范式,所有屬性完全依賴于某個鍵,如果所有的判定都是一個鍵,則實體滿足BCNF。(BCNF簡單地擴展了以前的范式,它說的是:一個實體可能有若干個鍵,所有屬性都必須依賴于這些鍵中的一個,也可以理解為“每個鍵必須唯一標(biāo)識實體,每個非鍵熟悉必須描述實體。”

3 去除實體組合鍵中的冗余

4NF-實體必須滿足BCNF,在一個屬性與實體的鍵之間,多值依賴(一條記錄在整個表的唯一性由多個值組合起來決定的)不能超過一個。

當(dāng)前設(shè)計不符合4NF的“臭味”:

  • 三元關(guān)系(實體:實體:實體)。
  • 潛伏的多值屬性。(如多個手機號。)
  • 臨時數(shù)據(jù)或歷史值。(需要將歷史數(shù)據(jù)的主體提出,否則將存在大量冗余。)

4 盡量將所有關(guān)系分解為二元關(guān)系 

5NF-實體必須滿足4NF,當(dāng)分解的信息無損的時候,確保所有關(guān)系都被分解為二元關(guān)系。

5NF保證在第四范式中存在的任何可以分解為實體的三元關(guān)系都被分解。有的三元關(guān)系可以在不丟失信息的前提下被分解為二元關(guān)系,當(dāng)分解為兩個二元關(guān)系的過程要丟失信息時,關(guān)系被宣稱為處于第四范式中。所以,第五范式建議是,最好把現(xiàn)有的三元關(guān)系都分解為3個二元關(guān)系。

需要注意的是,規(guī)范化的結(jié)果可能是更多的表,更復(fù)雜的查詢。因此,處理到何種程度,取決于性能和數(shù)據(jù)架構(gòu)的多方考量。建議規(guī)范化到第四范式,原因是5NF的判斷太過隱晦。例如:表X(老師,學(xué)生,課程)是一個三元關(guān)系,可以分解為表A(老師,學(xué)生),表B(學(xué)生,課程),表C(老師,課程)。表X表示某個老師是上某個學(xué)生的某個課程的老師;表A表示老師教學(xué)生;表B表示學(xué)生上課;表C表示老師教課。單獨看是無法發(fā)現(xiàn)問題的,但是從數(shù)據(jù)出發(fā),"表X=表A+表B+表C"并不一定成立,即不能通過連接構(gòu)建分解前的數(shù)據(jù)。因為可能有多種組合,喪失了表X反饋出的業(yè)務(wù)規(guī)則。這種現(xiàn)象,容易在設(shè)計階段被忽略,但好在在開放階段會被顯現(xiàn),而且并不經(jīng)常發(fā)生。

推薦做法:

  • 盡可能地遵守上述規(guī)范化原則。
  • 所有屬性描述的都應(yīng)該是體現(xiàn)被建模實體的本質(zhì)的內(nèi)容。
  • 至少必須有一個鍵,它唯一地標(biāo)識和描述了所建實體的本質(zhì)。
  • 主鍵要謹(jǐn)慎選擇。
  • 在邏輯階段能做多少規(guī)范化就做多少(性能不是邏輯階段考慮的范疇)。

(十)選擇數(shù)據(jù)類型(MS SQL 2008)

MS SQL的常用類型:

精確數(shù)字 不會發(fā)生精度損失 bit tinyint smallint int bigint decimal
近似數(shù)字 對于極值可能發(fā)生精度損失 float(N) real
日期和時間   date time smalldatetime datetime datetime2 datetimeoffset
二進制數(shù)據(jù)   bingary(N) varbinary(N) varbinary(max)
字符(串)數(shù)據(jù)   char(N) varchar(N) varchar(max) nchar(N) nvarchar(N) nvarchar(max)
存儲任意數(shù)據(jù)   sql_variant
時間戳   timestamp
GUID   uniqueidentifier
XML 不要試圖使用該類型規(guī)避1NF xml
空間數(shù)據(jù)   geometry geography
層次數(shù)據(jù)   heirarchyid

MS SQL中不在支持的或糟糕的類型選擇

  • image:被varbinary(max)取代。
  • text和ntext:被varchar(max)和nvarchar(max)取代。
  • money和smallmoney:開發(fā)過程中不好用,建議使用decimal。

常用類型選擇:

類型選擇的最基本規(guī)則是選擇滿足需要的最輕的類型,因為這樣查詢更快。

bool 建議使用bit而非char(1),因為開發(fā)語言對其支持覺好,可以直接映射為bool或bool?。
大值數(shù)據(jù) 使用所有備選類型中最小的那種,類型越大,查詢越慢,當(dāng)字節(jié)大于8000時,應(yīng)使用max。
主鍵 自增主鍵根據(jù)預(yù)期范圍選擇int或bigint,GUID使用uniqueidentifier而非varchar(N)。

(十一)優(yōu)化并行

設(shè)計DB時就應(yīng)該考慮到對并行進行優(yōu)化,比如,MS SQL中的timestamp類型就是極好的選擇。

四 命名規(guī)則

  • 表——“模塊名_表名”。表名最好不要用復(fù)數(shù),原因是在使用ORM框架開發(fā)時,代碼生成器根據(jù)DB生成類定義,表生成了某個實例的類型定義,而不是實例集合。表名不要太長。原因之一,某些軟件對表名最大長度有限制;原因之二,使用代碼生成器往往會根據(jù)表名生產(chǎn)類型名稱,之后懶人會直接使用這一名稱,如果將太長的名稱跨網(wǎng)絡(luò)邊界顯然不是明智之舉。
  • 字段——bool類型用“Is”、“Can”、“Has”等表示;日期類型命名必須包含“Date”;時間類型必須包含“Time”。
  • 存儲過程——使用“proc_”前綴。
  • 視圖——使用“view_”前綴。
  • 觸發(fā)器——使用“trig_”前綴。

原文鏈接:http://www.cnblogs.com/MeteorSeed/archive/2013/03/27/2880054.html

責(zé)任編輯:林師授 來源: 博客園
相關(guān)推薦

2017-04-01 18:00:08

開發(fā)者數(shù)據(jù)庫

2014-12-24 09:51:22

WebNoSQL

2014-12-24 09:48:13

NoSQL關(guān)系數(shù)據(jù)庫

2022-12-27 08:38:45

關(guān)系型數(shù)據(jù)庫設(shè)計

2021-01-26 13:31:48

數(shù)據(jù)庫關(guān)系型數(shù)據(jù)庫冗余

2023-05-22 16:10:51

動態(tài)共享包數(shù)據(jù)庫

2011-03-16 09:38:05

2011-03-16 09:33:45

數(shù)據(jù)庫開發(fā)錯誤

2018-07-18 09:16:39

關(guān)系型非關(guān)系型數(shù)據(jù)庫

2011-02-22 14:07:52

2022-01-16 22:16:59

數(shù)據(jù)庫Sentry開發(fā)者

2017-11-23 15:06:14

前端數(shù)據(jù)庫開發(fā)

2021-09-06 10:24:12

鴻蒙HarmonyOS應(yīng)用

2013-11-26 09:43:36

開發(fā)日志博客

2023-12-08 09:35:37

2016-09-08 23:28:06

2016-08-23 14:25:19

MySQL約束數(shù)據(jù)庫

2022-05-01 21:43:38

SQL設(shè)計模式

2017-03-17 14:44:04

關(guān)系型數(shù)據(jù)庫原理

2010-12-10 10:17:21

關(guān)系型數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號

av片在线观看永久免费| 国产乱码77777777| 国产精品午夜av| 亚洲大片在线观看| 国产富婆一区二区三区| 一级片中文字幕| 日韩国产一区| 亚洲成人aaa| mm1313亚洲国产精品无码试看| 超碰在线国产| 国产成人av影院| 国产激情久久久久| 波多野结衣不卡视频| 婷婷精品在线观看| 91精品国产综合久久蜜臀| 草b视频在线观看| 网友自拍视频在线| 91色视频在线| 亚洲tv在线观看| 91麻豆精品在线| 在线视频亚洲| 亚洲免费毛片| 亚洲在线观看免费| 丝袜足脚交91精品| 午夜国产在线观看| 国产乱一区二区| 国产精品444| 日本三级黄色大片| 91精品国产成人观看| 日韩精品视频在线观看网址| 午夜影院免费观看视频| 日本美女一区| 午夜精品在线看| 国产精品无码电影在线观看| 97视频在线观看网站| jizz一区二区| caoporn国产精品免费公开| 伊人久久久久久久久久久久| 亚洲精品一二| 久久久久北条麻妃免费看| 91精品人妻一区二区三区| 第四色在线一区二区| 欧美一级在线免费| 亚洲精品视频三区| 男女啪啪999亚洲精品| 日本精品一区二区三区四区的功能| 加勒比成人在线| 在线观看h网| 亚洲一区日韩精品中文字幕| 日韩国产精品毛片| 国产鲁鲁视频在线观看特色| 国产精品理伦片| 天堂√在线观看一区二区| 欧洲亚洲在线| 国产亚洲欧美色| 视频一区免费观看| 1024视频在线| 1024成人网| 日韩视频一二三| 日本理论片午伦夜理片在线观看| 亚洲另类春色国产| 69精品丰满人妻无码视频a片| 国产cdts系列另类在线观看| 中文字幕av在线一区二区三区| 日韩三级电影| 秋霞a级毛片在线看| 亚洲天堂成人在线观看| 亚洲综合av一区| a在线免费观看| 亚洲18色成人| 黄色av免费在线播放| 日韩av首页| 欧美绝品在线观看成人午夜影视| 色乱码一区二区三区在线| 国产原创一区| 日韩三级精品电影久久久| 在线播放第一页| 久久中文资源| 国产亚洲欧美另类中文| 五月婷婷综合激情网| 一区二区三区国产精华| 久久久久久91| 日韩精品一区二区亚洲av| 日本成人在线视频网站| 成人国内精品久久久久一区| www.97av| 久久久www成人免费无遮挡大片| 日本一区二区视频| 超碰国产在线观看| 亚洲精品乱码久久久久| 阿v天堂2017| 台湾佬成人网| 91精品国产91久久综合桃花| 99免费观看视频| 要久久电视剧全集免费| 日韩一区二区三区xxxx| 精品无码久久久久| 日韩av不卡在线观看| 91在线网站视频| 天天色综合av| 欧美大胆视频| 国产日韩欧美精品综合| 爱爱爱视频网站| 136福利第一导航国产在线| 色婷婷综合久久久久中文| 手机在线成人免费视频| 日本在线成人| 国产小视频91| 久久国产在线观看| 男人的天堂久久精品| 国产精品国模大尺度私拍| 国产粉嫩一区二区三区在线观看| 一区二区三区四区激情| 无码少妇一区二区三区芒果| 一区二区网站| www.国产一区| 亚洲日本视频在线观看| 国产成人啪免费观看软件| 青青草原成人| 欧美男人天堂| 欧美成人在线直播| 色婷婷粉嫩av| 久久精品电影| 国产精品12| av免费网站在线| 欧美无砖专区一中文字| 三级黄色片网站| 国产综合精品一区| 91精品综合久久久久久五月天| 免费在线高清av| 五月婷婷综合网| 丰满人妻一区二区三区大胸 | 国产jizz18女人高潮| 99日韩精品| 99re在线国产| 99福利在线| 在线播放一区二区三区| 亚洲综合欧美综合| 久久一区欧美| 免费国产一区| 日本在线高清| 日韩成人在线网站| 国产精品6666| 成人精品小蝌蚪| www.xxx麻豆| 北条麻妃在线一区二区免费播放| 欧美另类在线播放| 国产成人精品毛片| 亚洲毛片av在线| aaaaaaaa毛片| 午夜视频一区| 国产精品一区二区三区免费观看| 天堂av在线电影| 欧美不卡视频一区| 久久精品波多野结衣| 国产成人av自拍| 霍思燕三级露全乳照| 九色丨蝌蚪丨成人| 欧美亚洲成人精品| 偷拍25位美女撒尿视频在线观看| 欧美日韩国产精品| 无遮挡aaaaa大片免费看| 久久国产成人| 亚洲精品视频一二三| 天然素人一区二区视频| 中文字幕日韩在线观看| 伊人网免费视频| 亚洲欧洲制服丝袜| 日本一区二区免费视频| 欧美一区二区三区黄片| 国产一区二区三区综合| 无码毛片aaa在线| 1769国产精品视频| 97精品国产97久久久久久春色| 色吊丝在线永久观看最新版本| 色呦呦网站一区| 精品国产大片大片大片| 国产精品综合一区二区| 日本精品久久久久久久久久| 偷拍自拍亚洲色图| 国产精品视频1区| caoporn97在线视频| 日韩av在线一区| 中文在线观看av| 一区二区三区免费| 久久久久亚洲av无码专区桃色| 免费成人在线网站| 国产成人一区二区三区别| 精品午夜电影| 成人a级免费视频| 欧美xxxx少妇| 国产亚洲欧洲高清| 亚洲精品免费在线观看视频| 欧美视频不卡中文| 在线观看亚洲网站| 99精品视频在线播放观看| 日本激情视频在线播放| 欧美日本中文| 天堂精品视频| 久久中文资源| 亚洲一区二区三区香蕉| 午夜裸体女人视频网站在线观看| 日韩性生活视频| 婷婷视频在线观看| 欧美久久久久久蜜桃| 天天操天天爽天天干| 欧美国产日韩a欧美在线观看| 欧美国产在线一区| 蜜臀av亚洲一区中文字幕| 欧美大片免费播放| 欧洲三级视频| 久久久久久久久四区三区| 欧美成人aaa| 热99在线视频| 不卡一本毛片| 欧美成年人视频网站| 精品电影在线| 亚洲成年网站在线观看| 国产欧美一区二区三区视频在线观看| 色综合色综合色综合色综合色综合 | 亚洲青青久久| 日韩免费av一区二区| sis001亚洲原创区| 九九热精品视频| 快射视频在线观看| 最新国产精品亚洲| 精品成人一区二区三区免费视频| 亚洲精品一区二区三区影院| 国产精品视频无码| 欧美亚洲国产一区二区三区| 97久久久久久久| 亚洲高清视频的网址| 欧美人妻精品一区二区免费看| 国产精品久久三区| 公肉吊粗大爽色翁浪妇视频| 97精品久久久午夜一区二区三区 | 一级α片免费看刺激高潮视频| 精品久久久久久久久久| 久久久久久久久艹| 亚洲视频综合在线| 日日噜噜夜夜狠狠久久波多野| 国产精品视频yy9299一区| 国产高清一区二区三区四区| 久久日韩精品一区二区五区| 久久偷拍免费视频| 91亚洲精品久久久蜜桃网站| 日韩av手机在线播放| 99精品视频在线观看免费| 97人妻精品一区二区三区免费 | 国产精品一区二区三区不卡| 亚洲专区**| 国产精品日韩一区二区 | 精品国内二区三区| 午夜精品久久久久久久99老熟妇| 欧美日韩五码| 久久久久久91| av小说在线播放| 97超级碰碰碰| 成人av观看| 国产精品 欧美在线| 99热播精品免费| 国产在线视频91| 亚洲第一二区| 久久精品日产第一区二区三区精品版| 日本亚洲不卡| 日韩三级电影网站| 99精品网站| 无码人妻精品一区二区蜜桃网站| 精品999成人| 成人久久久久久久久| 日韩电影免费一区| 国产在线观看中文字幕| 国产精品正在播放| 免费无码一区二区三区| 久久久国产一区二区三区四区小说| 黄色片在线观看免费| 国产精品久久久久精k8| 欧美三级 欧美一级| 欧美日韩国产精品一区| 依依成人在线视频| 日韩欧美的一区| 国产视频精品久久| 欧美精品一区二区三区国产精品| 福利成人导航| 国产精品久久久久久超碰| 国产精品亚洲欧美日韩一区在线| 国产美女精品久久久| 欧美限制电影| 黄网站色视频免费观看| 久久尤物视频| 日本黄色三级网站| 91美女片黄在线| 情侣偷拍对白清晰饥渴难耐| 亚洲成人免费在线| 亚洲综合精品在线| 亚洲黄色成人网| 毛片在线视频| 日本精品久久久久久久| 日韩成人18| 亚洲高清视频一区二区| 黄色成人在线网址| 日本黄色的视频| 久久久久青草大香线综合精品| 亚洲怡红院在线观看| 欧美性感美女h网站在线观看免费| 一级日韩一级欧美| 国产网站欧美日韩免费精品在线观看 | 国产一区二区三区观看| 亚洲AV无码国产精品| 亚洲激情五月婷婷| 中国a一片一级一片| 亚洲精品wwww| 日本在线视频网址| 成人福利视频网| 精品视频免费| 国产免费黄色av| 国产盗摄一区二区三区| 夫妇露脸对白88av| 日韩欧美aaa| 日本免费一区视频| 美日韩精品免费视频| 久久精品国产福利| 日本一区二区三区免费观看| 亚洲日本久久| 91人妻一区二区| 亚洲精品写真福利| 91精品中文字幕| 亚洲一区二区黄| 欧美日韩五码| 欧美中文娱乐网| 噜噜噜91成人网| 国产精品一区二区无码对白| 亚洲精品国产成人久久av盗摄| 怡红院男人的天堂| 在线播放国产一区中文字幕剧情欧美 | 国产精品美女呻吟| 免费毛片在线不卡| 欧美 日韩 国产一区| 99久久精品国产麻豆演员表| 久久国产精品二区| 精品久久久久久久人人人人传媒| 日韩三级免费| 成人区精品一区二区| 欧美另类视频| 精品久久久久久无码人妻| 亚洲精品一二三四区| 精品人妻无码一区二区| 麻豆国产精品va在线观看不卡| 亚洲热av色在线播放| 在线播放豆国产99亚洲| 久久电影网电视剧免费观看| 国产人与禽zoz0性伦| 欧美丰满少妇xxxxx高潮对白| 三区四区电影在线观看| 成人午夜一级二级三级| 欧美 日韩 国产一区二区在线视频| 中文字幕66页| 亚洲精品亚洲人成人网 | 国产精品久久久久久av公交车| 亚洲午夜精品一区二区三区| 久久99久久99| 国产精品 欧美激情| 欧美成人女星排名| 人狥杂交一区欧美二区| 欧美日韩天天操| 久久99国产精品麻豆| 欧美精品久久久久久久久46p| 日韩欧美视频一区| 国产高清中文字幕在线| 免费影院在线观看一区| 麻豆精品一二三| 国产av无码专区亚洲av毛网站| 精品欧美乱码久久久久久| 久久久男人天堂| 无遮挡亚洲一区| 国产成人在线视频播放| 自拍偷拍欧美亚洲| 国产亚洲一区二区精品| 欧美久久亚洲| 欧美a在线视频| 国产精品久久久久久久久动漫| 国产美女永久免费| 69久久夜色精品国产69| 成人免费在线播放| 亚洲av无码成人精品区| 尤物网在线观看| 国产精品久久久久久搜索| 天天综合精品| 手机在线成人av| 欧美日韩免费视频| 91超碰免费在线| 亚洲最大免费| av电影在线观看一区| 中文字幕自拍偷拍| 久久久久久久av| 99精品在线免费在线观看| 手机免费看av片| 欧美福利电影网| 亚洲成a人片| av在线观看地址|