陳娟 李煒
(1.咸陽師范學(xué)院 陜西省咸陽市 712000 2.西藏民族大學(xué) 陜西省咸陽市 712082)
在當(dāng)代生活和工作中,隨時會產(chǎn)生大量的數(shù)據(jù)信息需要管理,數(shù)據(jù)庫是最方便、有效的管理工具,目前,數(shù)據(jù)庫分為關(guān)系型與非關(guān)系型兩種,關(guān)系型數(shù)據(jù)庫的歷史由來已久且應(yīng)用范圍更為廣泛,它是采用關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫。非關(guān)系型數(shù)據(jù)庫是非關(guān)系型、分布式、不提供ACID(數(shù)據(jù)庫事務(wù)處理的四個基本要素)的數(shù)據(jù)庫設(shè)計模式。
使用數(shù)據(jù)庫管理系統(tǒng),根據(jù)不同的工作項目設(shè)計并建立相應(yīng)的分散獨立的應(yīng)用數(shù)據(jù)庫,隨心所欲。當(dāng)項目需要擴(kuò)展時,數(shù)據(jù)庫也會隨之變化,但如果事先沒有進(jìn)行規(guī)劃,大量數(shù)據(jù)無法正常存儲和操作使用,數(shù)據(jù)庫不易擴(kuò)展和維護(hù),項目將無法正常進(jìn)行。關(guān)系型數(shù)據(jù)庫是一種建立在數(shù)據(jù)關(guān)聯(lián)性基礎(chǔ)上的數(shù)據(jù)庫,但是數(shù)據(jù)量巨大時,查找數(shù)據(jù)會產(chǎn)生額外的操作,會花費更多的時間,無法提高效率,所以使用關(guān)系型數(shù)據(jù)庫就會變得不再那么高效。
在互聯(lián)網(wǎng)不斷發(fā)展壯大的年代,非關(guān)系型數(shù)據(jù)庫成為了一個極其熱門的新的領(lǐng)域并且發(fā)展的十分迅速。特別是在一些超大規(guī)模和高并發(fā)的社交型的網(wǎng)站中,關(guān)系型數(shù)據(jù)庫暴露出了很多難以克服的問題,比如對數(shù)據(jù)庫高并發(fā)讀寫的需求、高效率存儲訪問的需求、高擴(kuò)展性及可用性的需求。除此之外,關(guān)系型數(shù)據(jù)庫的事務(wù)一致性、讀寫實時性、多表關(guān)聯(lián)查詢這些功能由于在此類型的網(wǎng)站的要求不高從而導(dǎo)致其無法發(fā)揮它應(yīng)有的功能,為了解決這類問題,非關(guān)系數(shù)據(jù)庫應(yīng)運而生,它的種類較多且大部分都開源,因此非關(guān)系型數(shù)據(jù)庫越來越受歡迎。但由于非關(guān)系型數(shù)據(jù)庫出現(xiàn)時間并不長且本身就具有多樣性,除了它們的一些共性之外,大部分都是針對不同的問題而采用不同的類型的非關(guān)系型數(shù)據(jù)庫。
隨著信息技術(shù)的發(fā)展,最早人工管理數(shù)據(jù)的方式已經(jīng)不能適應(yīng)大量數(shù)據(jù)的管理需求,此時數(shù)據(jù)庫技術(shù)逐步發(fā)展起來。數(shù)據(jù)庫(Database)是按照某種數(shù)據(jù)結(jié)構(gòu)來組織大量數(shù)據(jù)信息,并對它們進(jìn)行存儲和管理的倉庫,簡單來說,我們可以把數(shù)據(jù)庫看成是一個電子化的“文件柜”用來存儲大量的電子文件,用戶可以從“文件柜”中找到相應(yīng)文件并對其中的數(shù)據(jù)進(jìn)行增、刪、改、查等操作。在各單位日常管理中常常需要這樣的“文件柜”,例如,對某校學(xué)生的管理,可以把學(xué)生的學(xué)號、姓名、年齡、性別、籍貫、系別、聯(lián)系方式等信息存放在“文件柜”中,可以看成是一個數(shù)據(jù)庫,在這個數(shù)據(jù)庫中我們就可以根據(jù)需要隨時查詢學(xué)生的基本信息。因此,通過計算機(jī)對數(shù)據(jù)進(jìn)行管理能夠大大提高辦公的效率。數(shù)據(jù)庫技術(shù)具有以下特點:
(1)數(shù)據(jù)共享。多個用戶可以同時存取數(shù)據(jù)庫中的數(shù)據(jù),也可以通過各種接口使用數(shù)據(jù)庫中的數(shù)據(jù),避免了用戶存儲大量重復(fù)數(shù)據(jù),減少了數(shù)據(jù)冗余,避免造成數(shù)據(jù)之間的不相容性和不一致性。
(2)數(shù)據(jù)的獨立性。數(shù)據(jù)獨立性包括數(shù)據(jù)的物理獨立性和邏輯獨立性。物理獨立性是指數(shù)據(jù)物理結(jié)構(gòu)的變化不影響數(shù)據(jù)的邏輯結(jié)構(gòu);邏輯獨立性是指用戶的應(yīng)用程序與數(shù)據(jù)庫中數(shù)據(jù)相互獨立,應(yīng)用程序修改不會影響數(shù)據(jù)的使用。
(3)數(shù)據(jù)實現(xiàn)集中控制。區(qū)別于傳統(tǒng)文件管理方式中的數(shù)據(jù)分散狀態(tài),數(shù)據(jù)庫技術(shù)可對數(shù)據(jù)進(jìn)行集中控制和管理,并使用數(shù)據(jù)模型來表示各數(shù)據(jù)之間的關(guān)系。
(4)數(shù)據(jù)一致性和可維護(hù)性。通過數(shù)據(jù)的安全性控制、完整性控制和并發(fā)控制可以防止數(shù)據(jù)丟失、錯誤更新、保證數(shù)據(jù)的正確性和有效性,使得在同一時間周期內(nèi),允許對數(shù)據(jù)實現(xiàn)多路存取,又能防止用戶之間的不正常交互從而確保了數(shù)據(jù)的一致性和可維護(hù)性。
(5)故障恢復(fù)。數(shù)據(jù)庫系統(tǒng)通過相應(yīng)機(jī)制可及時發(fā)現(xiàn)系統(tǒng)物理上或邏輯上的故障,從而盡快恢復(fù)數(shù)據(jù)庫系統(tǒng)運行,防止數(shù)據(jù)被破壞。
目前數(shù)據(jù)庫技術(shù)分為關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫。
關(guān)系型數(shù)據(jù)庫是依據(jù)關(guān)系數(shù)據(jù)模型(二維表)來創(chuàng)建的數(shù)據(jù)庫,關(guān)系模型使用二維表格來存放所有的數(shù)據(jù),二維表也稱為關(guān)系,它是一系列二維數(shù)組的集合,用來代表與存儲數(shù)據(jù)對象之間的關(guān)系,由行和列組成。二維表之間具有“一對一、一對多、多對多”等關(guān)聯(lián),所以,一個關(guān)系型數(shù)據(jù)庫就是由二維表及表之間的關(guān)聯(lián)組成的一個數(shù)據(jù)結(jié)構(gòu)。
SQL(Structured Query Language)是結(jié)構(gòu)化查詢語言的英文簡稱,它是建立數(shù)據(jù)庫、修改、查詢數(shù)據(jù)等的程序設(shè)計語言,同時也是數(shù)據(jù)庫腳本文件的擴(kuò)展名。SQL 集數(shù)據(jù)查詢語言、數(shù)據(jù)操縱語言、數(shù)據(jù)定義語言和數(shù)據(jù)控制語言于一體,風(fēng)格統(tǒng)一,可以完成數(shù)據(jù)庫中的全部操作,包括定義關(guān)系模型、錄入數(shù)據(jù)、建立數(shù)據(jù)庫、查詢、修改、刪除數(shù)據(jù)庫及數(shù)據(jù)等,它為數(shù)據(jù)庫系統(tǒng)的開發(fā)提供了良好的基礎(chǔ)。在使用SQL 語言進(jìn)行數(shù)據(jù)操作時,用戶只需要告訴計算機(jī)“做什么”,而不需要說明“怎么做”,其操作過程會由系統(tǒng)自動控制。這種模式減輕了用戶的負(fù)擔(dān),有利于提高數(shù)據(jù)獨立性。關(guān)系型數(shù)據(jù)庫中普遍使用了標(biāo)準(zhǔn)數(shù)據(jù)查詢語言SQL,可以對關(guān)系數(shù)據(jù)庫中數(shù)據(jù)進(jìn)行查詢、操縱、定義和控制,是一個通用的且簡單易懂的數(shù)據(jù)庫管理語言。
關(guān)系型數(shù)據(jù)庫經(jīng)過數(shù)十年的發(fā)展,其理論基礎(chǔ)和相關(guān)技術(shù)、產(chǎn)品都非常豐富完善,是數(shù)據(jù)庫領(lǐng)域中的主流產(chǎn)品,且有著原子性、一致性、持久性、隔離性這四種特性(數(shù)據(jù)庫事務(wù)的ACID 特性),此外關(guān)系型數(shù)據(jù)庫還需要提供事務(wù)的恢復(fù)、回滾、并發(fā)控制、死鎖解決等問題。關(guān)系型數(shù)據(jù)庫便于使用且易于理解與維護(hù),還具有很強的安全性、事務(wù)保證性,所以被廣泛使用。但是隨著各類互聯(lián)網(wǎng)的興起,在生活中各類數(shù)據(jù)信息都會被我們在線使用或分享,關(guān)系型數(shù)據(jù)庫因為它本身的結(jié)構(gòu)特點而難以實現(xiàn)高效的易擴(kuò)展的架構(gòu),這時非關(guān)系型數(shù)據(jù)庫相對于關(guān)系型就會有更大的用處。
非關(guān)系型數(shù)據(jù)庫,也可稱之為NoSQL(Not Only SQL),意思是不僅僅是結(jié)構(gòu)化查詢語言SQL( Structured QueryLanguage)。NoSQL 不同于關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)庫管理方式,它所采用的數(shù)據(jù)模型并非關(guān)系型數(shù)據(jù)庫的關(guān)系模型,而是采用鍵值、列式、文檔等的非關(guān)系模型。它不支持關(guān)系型數(shù)據(jù)庫事務(wù)的ACID 特性。它們是建立在非傳統(tǒng)關(guān)系數(shù)據(jù)模型之上,它們的存在是為了滿足更多的互聯(lián)網(wǎng)業(yè)務(wù),并且一般它們均為開源免費的,因此使用起來更加的簡單方便。它主要的優(yōu)勢有兩個:
(1)擁有橫、縱雙向的擴(kuò)展能力:關(guān)系型數(shù)據(jù)庫由于其自身結(jié)構(gòu)特性問題必須布置在多個服務(wù)器上,但NoSQL 則可以布置在一個服務(wù)器上。
(2)結(jié)構(gòu)自由:在非關(guān)系型數(shù)據(jù)庫中一般保存的是鍵值對。這兩點優(yōu)勢可以讓NoSQL 更好的融入云計算環(huán)境,構(gòu)建更好的云服務(wù)。
關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫在使用場景上差別比較大,所以必須要在適合他們的領(lǐng)域應(yīng)用,才能發(fā)揮出這兩類數(shù)據(jù)庫的優(yōu)勢。
關(guān)系型數(shù)據(jù)庫具有以下優(yōu)點:
(1)因為關(guān)系型數(shù)據(jù)庫采用的是二維表,它更加的符合邏輯世界,所以相對于表的結(jié)構(gòu)更容易理解;
(2)它們是通用的SQL 語言,可以在一個表以及多個表之間做非常復(fù)雜的數(shù)據(jù)查詢,所以學(xué)習(xí)操作更加輕松方便;
(3)它的完整性及事務(wù)一致性讓它更容易維護(hù)。
關(guān)系型數(shù)據(jù)庫的缺點:
(1)因為要維護(hù)它的一致性,所以它的讀寫性會較差;
(2)結(jié)構(gòu)固定;
(3)海量數(shù)據(jù)的讀寫效率不高。
非關(guān)系型數(shù)據(jù)庫具有以下優(yōu)點:
(1)讀寫性很高;
(2)基于key-value 鍵值對,可以想象成表中的主鍵和值的對應(yīng)關(guān)系,而且不需要經(jīng)過SQL 層的解析,所以性能較好,易于擴(kuò)展;
(3)格式靈活,數(shù)據(jù)類型多種多樣,可以是鍵對值,甚至是文檔、圖片,應(yīng)用場景廣泛,但是關(guān)系型數(shù)據(jù)庫只支持原有的數(shù)據(jù)類型。
非關(guān)系型數(shù)據(jù)庫的缺點:
(1)不提供SQL 支持,學(xué)習(xí)成本高;
(2)沒有事務(wù)處理。
目前,關(guān)系型數(shù)據(jù)庫應(yīng)用廣泛且擁有許多成功案列,但隨著社會的發(fā)展,人們對于數(shù)據(jù)的快速處理、響應(yīng)及大數(shù)據(jù)分析有著越來越高的要求,并且對數(shù)據(jù)的高擴(kuò)展性的需求也不斷提高。關(guān)系型數(shù)據(jù)庫已不能滿足這些要求,這時候就需要非關(guān)系型數(shù)據(jù)庫。由于數(shù)據(jù)結(jié)構(gòu)設(shè)置的方式不同,關(guān)系型數(shù)據(jù)庫呈現(xiàn)的是一種數(shù)據(jù)規(guī)范化之后的結(jié)果,而非關(guān)系型數(shù)據(jù)庫展現(xiàn)的則是一種數(shù)據(jù)結(jié)構(gòu)化存儲方法的集合,對應(yīng)不同的使用場景,可以選擇不同的數(shù)據(jù)庫。
非關(guān)系型數(shù)據(jù)庫嚴(yán)格上不是一種數(shù)據(jù)庫,它是一種數(shù)據(jù)結(jié)構(gòu)化存儲方法的集合,主要有以下幾類:
基于列式的存儲以流的方式在列中存儲所有的數(shù)據(jù)。對于任何記錄,索引都可以快速地獲取列上的數(shù)據(jù);列式存儲支持行檢索,但這需要從每個列獲取匹配的列值,并重新組成行。這種方式使系統(tǒng)具有更高的可擴(kuò)展性,使得操作更加簡單方便?;诹惺降拇鎯Ψ绞结槍A康臄?shù)據(jù)有很好的適應(yīng)性,這個特點與云計算所需的相關(guān)需求是相符合的。目前使用基于列式的數(shù)據(jù)庫有Apache HBase,Hypertable 以及Google BigTable。
鍵值對存儲方式是非關(guān)系數(shù)據(jù)庫中最簡單的一種存儲方式,它是一個鍵-值的集合,好像數(shù)據(jù)結(jié)構(gòu)中的Hash 表一樣,每個鍵分別對應(yīng)一個值,鍵值中所存儲的數(shù)據(jù)的類型是不受限制的,可以是一個字符串,也可以是一個數(shù)字,甚至也可以是一系列的鍵值對封裝成的對象等。通過對主鍵的操作能夠大大提高查詢和修改的速度,大量數(shù)據(jù)存放也較為方便。在現(xiàn)實場景中,對大量數(shù)據(jù)的高訪問負(fù)載或日志系統(tǒng)中都應(yīng)用到了鍵值對存儲方式。使用鍵值對存儲數(shù)據(jù)的數(shù)據(jù)庫有MemcacheDB、BerkeleyDB、Redis 等。
文檔存儲方式是基于鍵值對存儲方式的,也是每個Key 分別對應(yīng)一個Value,但是這類方式更加復(fù)雜。設(shè)計文檔存儲方式的最初的目的就是用于存儲日常文檔的,它將一個特定文檔的結(jié)構(gòu)使用一種特定的模式來存儲,便于進(jìn)行復(fù)雜的查詢和計算。對于網(wǎng)站中大量數(shù)據(jù)、緩存以及JSON(JavaScriptObjectNotations) 數(shù)據(jù)的存儲使用較多。典型代表為MongoDB、CouchDB 等,這類數(shù)據(jù)庫可在海量的數(shù)據(jù)中快速查詢數(shù)據(jù)。
圖數(shù)據(jù)庫所要解決的問題與圖和圖論相關(guān)。圖數(shù)據(jù)庫,例如Neo4j,其目的是為用戶提供一種更好的方法用于管理結(jié)構(gòu)復(fù)雜、呈網(wǎng)狀分布的數(shù)據(jù)。當(dāng)然,基于圖模型實現(xiàn)的解決方案并不僅有Neo4j 圖形數(shù)據(jù)庫,有的產(chǎn)品成熟度不同,有的開源或閉源,例如AllegroGraph、FlockDB、InfiniteGraph 和OrientDB 等。在社交網(wǎng)絡(luò)、推薦系統(tǒng)等環(huán)境中會使用到圖數(shù)據(jù)庫。
隨著網(wǎng)絡(luò)不斷發(fā)展,需要處理的數(shù)據(jù)規(guī)模越來越大、越來越復(fù)雜,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫已無法應(yīng)對更加復(fù)雜的模型,非關(guān)系數(shù)據(jù)庫憑借其易擴(kuò)展、高性能和靈活的數(shù)據(jù)模型得到了非常迅速的發(fā)展。非關(guān)系數(shù)據(jù)庫的優(yōu)勢相當(dāng)明顯,但同時也存在一些問題,非關(guān)系數(shù)據(jù)庫不支持結(jié)構(gòu)化查詢語言SQL,這無疑會增大學(xué)習(xí)和使用成本;非關(guān)系數(shù)據(jù)庫無事務(wù)處理,這就決定了數(shù)據(jù)的一致性、完整性很難保存。由于所使用的場景不同,關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫并非對立的關(guān)系,而應(yīng)優(yōu)勢互補,共同作用。通常情況可使用關(guān)系型數(shù)據(jù)庫,在某些關(guān)系數(shù)據(jù)庫無法處理數(shù)據(jù)時可使用非關(guān)系數(shù)據(jù)庫,讓非關(guān)系數(shù)據(jù)庫作為對關(guān)系型數(shù)據(jù)庫補充。