一、關(guān)系型數(shù)據(jù)庫的本質(zhì)是什么,mongodb不是關(guān)系型數(shù)據(jù)庫的原因
關(guān)系型數(shù)據(jù)庫的本質(zhì)是“relation”。這里中文翻譯成“關(guān)系”有點籠統(tǒng),因為還有一個詞叫“relationship”也被說成“關(guān)系”?!皉elation”是個數(shù)學(xué)概念,定義如下:給定n個集合S1、S2、 S3、 …、 Sn, R是一個n元數(shù)組(n-tuples),它的名列前茅個元素取自集合S1,第二個元素取自集合S2,以此類推。我們將R稱之為基于該n 個集合的一個Relation,Sj為R的第j個域(Domain)。
這個定義有點抽象,舉個例子:有這樣一個“relation”,它由以下集合組成:學(xué)號,姓名,性別,班級。每個集合都是一個給定的有限集合,比如學(xué)號的范圍定義為10000~99999,姓名也是個有限集合,性別就是男和女,班級也是個有限的集合。從這些有限的集合中各取一個值,組成一個元組“tuple”。理論上這些元組也是一個有限集合,稱之為“關(guān)系”,即“relation”。而我們更習(xí)慣稱之為“表”,即”table”。此外,這種建模思想能促進重用,例如“性別”這個值域也可用在“教師”這個表里。這點在建立大型信息系統(tǒng)是極有價值的。
不能將MongoDB叫做關(guān)系型數(shù)據(jù)庫是因為它一開始的設(shè)計理念是“對象”,而不是“關(guān)系”。不管在工程上你怎么用它,它只能被喚做對象或者文檔型數(shù)據(jù)庫。關(guān)系型數(shù)據(jù)庫在誕生之時,主要解決的問題之一是消除訪問路徑依賴。當(dāng)你用MongoDB的時候,你可以根據(jù)一個對象的任意屬性去訪問相應(yīng)的對象實體。但如果兩個不同類型的對象存在某種關(guān)系(relationship) ,你想通過對象A的某個屬性訪問到對象B的某個屬性會比較困難。你必須在A中保存B的一些關(guān)聯(lián)信息,然后自己在應(yīng)用層面去實現(xiàn)類似SQL JOIN的關(guān)聯(lián)訪問。這就是說你的應(yīng)用程序可能存在只能通過A去訪問B的限制。也許在開始的時候,這樣的限制無所謂。
二、關(guān)系型數(shù)據(jù)庫概述
1、簡介
關(guān)系型數(shù)據(jù)庫,是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫,其以行和列的形式存儲數(shù)據(jù),以便于用戶理解,關(guān)系型數(shù)據(jù)庫這一系列的行和列被稱為表,一組表組成了數(shù)據(jù)庫。用戶通過查詢來檢索數(shù)據(jù)庫中的數(shù)據(jù),而查詢是一個用于限定數(shù)據(jù)庫中某些區(qū)域的執(zhí)行代碼。關(guān)系模型可以簡單理解為二維表格模型,而一個關(guān)系型數(shù)據(jù)庫就是由二維表及其之間的關(guān)系組成的一個數(shù)據(jù)組織。
2、特點
存儲方式:傳統(tǒng)的關(guān)系型數(shù)據(jù)庫采用表格的儲存方式,數(shù)據(jù)以行和列的方式進行存儲,要讀取和查詢都十分方便。存儲結(jié)構(gòu):關(guān)系型數(shù)據(jù)庫按照結(jié)構(gòu)化的方法存儲數(shù)據(jù),每個數(shù)據(jù)表都必須對各個字段定義好,再根據(jù)表的結(jié)構(gòu)存入數(shù)據(jù),這樣做的好處就是由于數(shù)據(jù)的形式和內(nèi)容在存入數(shù)據(jù)之前就已經(jīng)定義好了,所以整個數(shù)據(jù)表的可靠性和穩(wěn)定性都比較高,但帶來的問題就是一旦存入數(shù)據(jù)后,如果需要修改數(shù)據(jù)表的結(jié)構(gòu)就會十分困難。存儲規(guī)范:關(guān)系型數(shù)據(jù)庫為了避免重復(fù)、規(guī)范化數(shù)據(jù)以及充分利用好存儲空間,把數(shù)據(jù)按照最小關(guān)系表的形式進行存儲,這樣數(shù)據(jù)管理的就可以變得很清晰、一目了然,當(dāng)然這主要是一張數(shù)據(jù)表的情況。如果是多張表情況就不一樣了,由于數(shù)據(jù)涉及到多張數(shù)據(jù)表,數(shù)據(jù)表之間存在著復(fù)雜的關(guān)系,隨著數(shù)據(jù)表數(shù)量的增加,數(shù)據(jù)管理會越來越復(fù)雜。擴展方式:由于關(guān)系型數(shù)據(jù)庫將數(shù)據(jù)存儲在數(shù)據(jù)表中,數(shù)據(jù)操作的瓶頸出現(xiàn)在多張數(shù)據(jù)表的操作中,而且數(shù)據(jù)表越多這個問題越嚴重,如果要緩解這個問題,只能提高處理能力,也就是選擇速度更快性能更高的計算機,這樣的方法雖然可以一定的拓展空間,但這樣的拓展空間一定有非常有限的,也就是關(guān)系型數(shù)據(jù)庫只具備縱向擴展能力。查詢方式:關(guān)系型數(shù)據(jù)庫采用結(jié)構(gòu)化查詢語言(即SQL)來對數(shù)據(jù)庫進行查詢,SQL早已獲得了各個數(shù)據(jù)庫廠商的支持,成為數(shù)據(jù)庫行業(yè)的標(biāo)準,它能夠支持數(shù)據(jù)庫的CRUD(增加,查詢,更新,刪除)操作,具有非常強大的功能,SQL可以采用類似索引的方法來加快查詢操作。規(guī)范化:在數(shù)據(jù)庫的設(shè)計開發(fā)過程中開發(fā)人員通常會面對同時需要對一個或者多個數(shù)據(jù)實體進行操作,這樣在關(guān)系型數(shù)據(jù)庫中,一個數(shù)據(jù)實體一般首先要分割成多個部分,然后再對分割的部分進行規(guī)范化,規(guī)范化以后再分別存入到多張關(guān)系型數(shù)據(jù)表中,這是一個復(fù)雜的過程。事務(wù)性:關(guān)系型數(shù)據(jù)庫強調(diào)ACID規(guī)則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),可以滿足對事務(wù)性要求較高或者需要進行復(fù)雜數(shù)據(jù)查詢的數(shù)據(jù)操作,而且可以充分滿足數(shù)據(jù)庫操作的高性能和操作穩(wěn)定性的要求。并且關(guān)系型數(shù)據(jù)庫十分強調(diào)數(shù)據(jù)的強一致性,對于事務(wù)的操作有很好的支持。讀寫性能:關(guān)系型數(shù)據(jù)庫十分強調(diào)數(shù)據(jù)的一致性,并為此降低讀寫性能付出了巨大的代價,雖然關(guān)系型數(shù)據(jù)庫存儲數(shù)據(jù)和處理數(shù)據(jù)的可靠性很不錯,但一旦面對海量數(shù)據(jù)的處理的時候效率就會變得很差,特別是遇到高并發(fā)讀寫的時候性能就會下降的非常厲害。授權(quán)方式:關(guān)系型數(shù)據(jù)庫常見的有 Oracle,SQLServer,DB2,Mysql,除了Mysql大多數(shù)的關(guān)系型數(shù)據(jù)庫如果要使用都需要支付一筆價格高昂的費用,即使是免費的Mysql性能也受到了諸多的限制。3、設(shè)計步驟
關(guān)系型數(shù)據(jù)庫設(shè)計的過程可大體分為四個時期。
用戶需求分析時期,主要是了解和分析用戶對數(shù)據(jù)的功能需求和應(yīng)用需求,是整個設(shè)計過程的基礎(chǔ),事關(guān)整個數(shù)據(jù)庫應(yīng)用系統(tǒng)設(shè)計的成敗。數(shù)據(jù)庫設(shè)計時期,主要是將用戶需求進行綜合、歸納與抽象,形成一個獨立于具體DBMS的數(shù)據(jù)模型,可用實體—聯(lián)系模型來表示,然后將其轉(zhuǎn)換為已選好的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)RDBMS所支持的一組關(guān)系模式并為其選取一個適合應(yīng)用環(huán)境的物理結(jié)構(gòu),包括存儲結(jié)構(gòu)和存取方法。數(shù)據(jù)庫實現(xiàn)時期,包括數(shù)據(jù)庫結(jié)構(gòu)創(chuàng)建階段和應(yīng)用行為設(shè)計與實現(xiàn)階段,是根據(jù)數(shù)據(jù)庫的物理模型創(chuàng)建數(shù)據(jù)庫、創(chuàng)建表、創(chuàng)建索引、創(chuàng)建聚簇等。數(shù)據(jù)庫運行與維護階時期,最后一個階段則是數(shù)據(jù)庫應(yīng)用系統(tǒng)經(jīng)過試運行后即可投入正式運行。4、設(shè)計原則
在進行關(guān)系型數(shù)據(jù)庫的設(shè)計過程中,要遵循以下幾個原則,借此可以提高數(shù)據(jù)庫的存儲效率、數(shù)據(jù)完整性和可擴展性。
命名規(guī)范化:在概念模型設(shè)計中,對于出現(xiàn)的實體、屬性及相關(guān)表的結(jié)構(gòu)要統(tǒng)一。例如在數(shù)據(jù)庫設(shè)計中,指定學(xué)生Sstudent,專指本科生,相關(guān)的屬性有:學(xué)號、姓名、性別、出生年月等,及每個屬性的類型、長度、取值范圍等都要進行確定,這樣就能保證在命名時不會出現(xiàn)同名異義或異名同義、屬性特征及結(jié)構(gòu)沖突等問題。數(shù)據(jù)的一致性和完整性:在關(guān)系型數(shù)據(jù)庫中可以采用域完整性、實體完整性和參照完整性等約束條件來滿足其數(shù)據(jù)的一致性和完整性,用check、default、null、主鍵和外鍵約束來實現(xiàn)。數(shù)據(jù)冗余:數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)盡可能地減少冗余,這就意味著重復(fù)數(shù)據(jù)應(yīng)該減少到最少。例如:若一個部門職員的電話存儲在不同的表中,假設(shè)該職員的電話號碼發(fā)生變化時,冗余數(shù)據(jù)的存在就要求對多個表進行更新操作,若某個表不幸被忽略了,那么就會造成數(shù)據(jù)不一致的情況。所以在數(shù)據(jù)庫設(shè)計中一定要盡可能存在少地冗余。范式理論:在關(guān)系數(shù)據(jù)庫設(shè)計時,一般是通過設(shè)計滿足某一范式來獲得一個好的數(shù)據(jù)庫模式,通常認為3NF在性能、擴展性和數(shù)據(jù)完整性方面達到了較好的平衡,因此,一般數(shù)據(jù)庫設(shè)計要求達到3NF,消除數(shù)據(jù)依賴中不合理的部分,最終實現(xiàn)使一個關(guān)系僅描述一個實體或者實體間一種聯(lián)系的目的。三、MangoDB的特點
面向文檔存儲,基于JSON/BSON 可表示靈活的數(shù)據(jù)結(jié)構(gòu)動態(tài)DDL能力,沒有強Schema約束,支持快速迭代高性能計算,提供基于內(nèi)存的快速數(shù)據(jù)查詢?nèi)菀讛U展,利用數(shù)據(jù)分片可以支持海量數(shù)據(jù)存儲豐富的功能集,支持二級索引、強大的聚合管道功能,為開發(fā)者量身定做的功能,如數(shù)據(jù)自動老化、固定集合等等跨平臺版本、支持多語言SDK延伸閱讀1:什么是MongoDB
MongoDB 是一個跨平臺的,面向文檔的數(shù)據(jù)庫,是當(dāng)前 NoSQL 數(shù)據(jù)庫產(chǎn)品中最熱門的一種。它介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的產(chǎn)品。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似 JSON 的 BSON 格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。