001_数据库介绍
一. 什么是數(shù)據(jù)庫(kù)
1. 數(shù)據(jù)庫(kù)是存放數(shù)據(jù)的倉(cāng)庫(kù)。它的存儲(chǔ)空間很大, 可以存放百萬(wàn)條、千萬(wàn)條、上億條數(shù)據(jù)。但是數(shù)據(jù)庫(kù)并不是隨意地將數(shù)據(jù)進(jìn)行存放, 是有一定的規(guī)則的, 否則查詢的效率會(huì)很低。互聯(lián)網(wǎng)世界充斥著大量的數(shù)據(jù), 即這個(gè)互聯(lián)網(wǎng)世界就是數(shù)據(jù)世界。數(shù)據(jù)的來(lái)源有很多, 比如: 出行記錄、消費(fèi)記錄、瀏覽的網(wǎng)頁(yè)、發(fā)送的消息等等。除了文本類型的數(shù)據(jù), 圖像、音樂(lè)、聲音也是數(shù)據(jù)。
2. 數(shù)據(jù)庫(kù)是一個(gè)按數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)和管理數(shù)據(jù)的計(jì)算機(jī)軟件系統(tǒng)。數(shù)據(jù)庫(kù)的概念實(shí)際包括兩層意思:
2.1. 數(shù)據(jù)庫(kù)是一個(gè)能夠存儲(chǔ)數(shù)據(jù)的"倉(cāng)庫(kù)", 用戶在該"倉(cāng)庫(kù)"中存放數(shù)據(jù), "數(shù)據(jù)"和"庫(kù)"兩個(gè)概念結(jié)合成為數(shù)據(jù)庫(kù)。
2.2. 數(shù)據(jù)庫(kù)是管理數(shù)據(jù)的新方法和技術(shù), 它能更合理的組織數(shù)據(jù)、更方便的維護(hù)數(shù)據(jù)、更嚴(yán)密的控制數(shù)據(jù)和更有效的利用數(shù)據(jù)。
二. 數(shù)據(jù)的發(fā)展
1. 在數(shù)據(jù)庫(kù)的發(fā)展歷史上, 數(shù)據(jù)庫(kù)先后經(jīng)歷了層次數(shù)據(jù)庫(kù)、網(wǎng)狀數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)等各個(gè)階段的發(fā)展。數(shù)據(jù)庫(kù)技術(shù)在各個(gè)方面的快速的發(fā)展, 特別是關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)成為目前數(shù)據(jù)庫(kù)產(chǎn)品中最重要的一員。80年代以來(lái), 幾乎所有的數(shù)據(jù)庫(kù)廠商新出的數(shù)據(jù)庫(kù)產(chǎn)品都支持關(guān)系型數(shù)據(jù)庫(kù), 即使是一些非關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品也幾乎都有支持關(guān)系數(shù)據(jù)庫(kù)的接口。這主要是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)可以比較好的解決管理和存儲(chǔ)關(guān)系型數(shù)據(jù)的問(wèn)題。隨著云計(jì)算的發(fā)展和大數(shù)據(jù)時(shí)代的到來(lái), 關(guān)系型數(shù)據(jù)庫(kù)越來(lái)越無(wú)法滿足需要, 這主要是由于越來(lái)越多的半關(guān)系型和非關(guān)系型數(shù)據(jù)需要用數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)管理, 與此同時(shí), 分布式技術(shù)等新技術(shù)的出現(xiàn)也對(duì)數(shù)據(jù)庫(kù)的技術(shù)提出了新的要求, 于是越來(lái)越多的非關(guān)系型數(shù)據(jù)庫(kù)就開(kāi)始出現(xiàn), 這類數(shù)據(jù)庫(kù)與傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在設(shè)計(jì)和數(shù)據(jù)結(jié)構(gòu)方面有了很大的不同, 它們更強(qiáng)調(diào)數(shù)據(jù)庫(kù)數(shù)據(jù)的高并發(fā)讀寫(xiě)和存儲(chǔ)大數(shù)據(jù), 這類數(shù)據(jù)庫(kù)一般被稱為NoSQL(Not only SQL)數(shù)據(jù)庫(kù)。而傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)在一些傳統(tǒng)領(lǐng)域依然保持了強(qiáng)大的生命力。
三. 關(guān)系數(shù)據(jù)庫(kù)
1. 關(guān)系型數(shù)據(jù)庫(kù), 存儲(chǔ)的格式可以直觀地反映實(shí)體間的關(guān)系。關(guān)系型數(shù)據(jù)庫(kù)和常見(jiàn)的表格比較相似, 關(guān)系型數(shù)據(jù)庫(kù)中表與表之間是有很多復(fù)雜的關(guān)聯(lián)關(guān)系的。常見(jiàn)的關(guān)系型數(shù)據(jù)庫(kù)有Oracle, Mysql, SqlServer, DB2(IBM公司的)等。在輕量或者小型的應(yīng)用中, 使用不同的關(guān)系型數(shù)據(jù)庫(kù)對(duì)系統(tǒng)的性能影響不大, 但是在構(gòu)建大型應(yīng)用時(shí), 則需要根據(jù)應(yīng)用的業(yè)務(wù)需求和性能需求, 選擇合適的關(guān)系型數(shù)據(jù)庫(kù)。
2. 標(biāo)準(zhǔn)SQL語(yǔ)句
2.1. 雖然關(guān)系型數(shù)據(jù)庫(kù)有很多, 但是大多數(shù)都遵循SQL(結(jié)構(gòu)化查詢語(yǔ)言, Structured Query Language)標(biāo)準(zhǔn)。常見(jiàn)的操作有查詢, 新增, 更新, 刪除, 求和, 排序等。
2.2. 查詢語(yǔ)句: SELECT param FROM table WHERE condition該語(yǔ)句可以理解為從table中查詢出滿足condition條件的字段param。 ?
2.3. 新增語(yǔ)句: INSERT INTO table (param1,?param2,?param3) VALUES (value1, value2,value3)該語(yǔ)句可以理解為向table中的param1, param2, param3字段中分別插入value1,value2,value3。
2.4. 更新語(yǔ)句: UPDATE table SET param=new_value WHERE condition該語(yǔ)句可以理解為將滿足condition條件的字段param更新為new_value值。 ?
2.5. 刪除語(yǔ)句: DELETE FROM table WHERE condition該語(yǔ)句可以理解為將滿足condition條件的數(shù)據(jù)全部刪除。
2.6. 去重查詢: SELECT DISTINCT param FROM table WHERE condition該語(yǔ)句可以理解為從表table中查詢出滿足條件condition的字段param, 但是param中重復(fù)的值只能出現(xiàn)一次。
2.7. 排序查詢: SELECT param FROM table WHERE condition ORDER BY param1該語(yǔ)句可以理解為從表table 中查詢出滿足condition條件的param,并且要按照param1升序的順序進(jìn)行排序。 ?
2.8. 總體來(lái)說(shuō), 數(shù)據(jù)庫(kù)的SELECT,INSERT,UPDATE,DELETE對(duì)應(yīng)了我們常用的增刪改查四種操作。
3. MySQL是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng), 在WEB應(yīng)用方面MySQL是最好的RDBMS(Relational Database Management System: 關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一。
4. RDBMS即關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(Relational Database Management System)的特點(diǎn):
4.1. 數(shù)據(jù)以表格的形式出現(xiàn)。
4.2. 每行為各種記錄名稱。
4.3. 每列為記錄名稱所對(duì)應(yīng)的數(shù)據(jù)域。
4.4. 許多的行和列組成一張表單。
4.5. 若干的表單組成database。
5. RDBMS術(shù)語(yǔ):
5.1. 數(shù)據(jù)庫(kù): 數(shù)據(jù)庫(kù)是一些關(guān)聯(lián)表的集合。
5.2. 數(shù)據(jù)表: 表是數(shù)據(jù)的矩陣。在一個(gè)數(shù)據(jù)庫(kù)中的表看起來(lái)像一個(gè)簡(jiǎn)單的電子表格。
5.3. 列: 一列(數(shù)據(jù)元素)包含了相同類型的數(shù)據(jù)。
5.4. 行: 一行(元組或記錄)是一組相關(guān)的數(shù)據(jù)。
5.5. 冗余: 存儲(chǔ)兩倍數(shù)據(jù), 冗余降低了性能, 但提高了數(shù)據(jù)的安全性。
5.6. 主鍵: 主鍵是唯一的。一個(gè)數(shù)據(jù)表中只能包含一個(gè)主鍵。你可以使用主鍵來(lái)查詢數(shù)據(jù)。
5.7. 外鍵: 外鍵用于關(guān)聯(lián)兩個(gè)表。
5.8. 復(fù)合鍵: 復(fù)合鍵(組合鍵)將多個(gè)列作為一個(gè)索引鍵, 一般用于復(fù)合索引。
5.9. 索引: 使用索引可快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。類似于書(shū)籍的目錄。
5.10. 參照完整性: 參照的完整性要求關(guān)系中不允許引用不存在的實(shí)體。
5.11. 實(shí)體完整性: 是關(guān)系模型必須滿足的完整性約束條件, 目的是保證數(shù)據(jù)的一致性。
6. MySQL數(shù)據(jù)庫(kù)
6.1. MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng), 這種所謂的"關(guān)系型"可以理解為"表格"的概念, 一個(gè)關(guān)系型數(shù)據(jù)庫(kù)由一個(gè)或數(shù)個(gè)表格組成, 如圖所示的一個(gè)表格:
6.2. MySQL是由瑞典MySQL AB公司開(kāi)發(fā), 目前屬于Oracle公司。MySQL是一種關(guān)聯(lián)數(shù)據(jù)庫(kù)管理系統(tǒng), 關(guān)聯(lián)數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中, 而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi), 這樣就增加了速度并提高了靈活性。
6.3. MySQL是開(kāi)源的, 目前隸屬于Oracle旗下產(chǎn)品。
6.4. MySQL支持大型的數(shù)據(jù)庫(kù)。可以處理?yè)碛猩锨f(wàn)條記錄的大型數(shù)據(jù)庫(kù)。
6.5. MySQL使用標(biāo)準(zhǔn)的SQL數(shù)據(jù)語(yǔ)言形式。
6.6. MySQL可以運(yùn)行于多個(gè)系統(tǒng)上, 并且支持多種語(yǔ)言。這些編程語(yǔ)言包括: C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
6.7. MySQL支持大型數(shù)據(jù)庫(kù), 支持5000萬(wàn)條記錄的數(shù)據(jù)倉(cāng)庫(kù), 32位系統(tǒng)表文件最大可支持4GB, 64位系統(tǒng)支持最大的表文件為8TB。
6.8. MySQL是可以定制的, 采用了GPL協(xié)議, 你可以修改源碼來(lái)開(kāi)發(fā)自己的MySQL系統(tǒng)。
6.9. 此外, 你也可以使用MariaDB代替, MariaDB數(shù)據(jù)庫(kù)管理系統(tǒng)是MySQL的一個(gè)分支, 主要由開(kāi)源社區(qū)在維護(hù), 采用GPL授權(quán)許可。開(kāi)發(fā)這個(gè)分支的原因之一是: 甲骨文公司收購(gòu)了MySQL后, 有將MySQL閉源的潛在風(fēng)險(xiǎn), 因此社區(qū)采用分支的方式來(lái)避開(kāi)這個(gè)風(fēng)險(xiǎn)。
6.10. MariaDB的目的是完全兼容MySQL, 包括API和命令行, 使之能輕松成為MySQL的代替品。
四. 非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)
1. NoSQL最常見(jiàn)的解釋是"non-relational", "Not Only SQL"也被很多人接受。NoSQL僅僅是一個(gè)概念, 泛指非關(guān)系型的數(shù)據(jù)庫(kù), 區(qū)別于關(guān)系數(shù)據(jù)庫(kù), 它們不保證關(guān)系數(shù)據(jù)的ACID特性。NoSQL是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng), 其擁護(hù)者們提倡運(yùn)用非關(guān)系型的數(shù)據(jù)存儲(chǔ), 相對(duì)于鋪天蓋地的關(guān)系型數(shù)據(jù)庫(kù)運(yùn)用, 這一概念無(wú)疑是一種全新的思想的注入。
2. NoSQL數(shù)據(jù)庫(kù)種類繁多, 但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性。數(shù)據(jù)之間無(wú)關(guān)系, 這樣就非常容易擴(kuò)展。無(wú)形之間也在架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力。NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫(xiě)性能, 尤其在大數(shù)據(jù)量下, 同樣表現(xiàn)優(yōu)秀。NoSQL數(shù)據(jù)庫(kù)適合追求速度和可擴(kuò)展性、業(yè)務(wù)多變的應(yīng)用場(chǎng)景。
3. 常見(jiàn)的非關(guān)系型數(shù)據(jù)庫(kù)有: Redis、Memcache、Hbase、MongoDB等。
4. 目前NoSQL數(shù)據(jù)庫(kù)仍然沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn), 它現(xiàn)在有四種大的分類:
4.1. 鍵值對(duì)存儲(chǔ)(key-value): 代表軟件Redis, 它的優(yōu)點(diǎn)能夠進(jìn)行數(shù)據(jù)的快速查詢, 而缺點(diǎn)是需要存儲(chǔ)數(shù)據(jù)之間的關(guān)系。
4.2. 列存儲(chǔ): 代表軟件Hbase, 它的優(yōu)點(diǎn)是對(duì)數(shù)據(jù)能快速查詢, 數(shù)據(jù)存儲(chǔ)的擴(kuò)展性強(qiáng)。而缺點(diǎn)是數(shù)據(jù)庫(kù)的功能有局限性。
4.3. 文檔數(shù)據(jù)庫(kù)存儲(chǔ): 代表軟件MongoDB, 它的優(yōu)點(diǎn)是對(duì)數(shù)據(jù)結(jié)構(gòu)要求不特別的嚴(yán)格。而缺點(diǎn)是查詢性的性能不好, 同時(shí)缺少一種統(tǒng)一查詢語(yǔ)言。
4.4. 圖形數(shù)據(jù)庫(kù)存儲(chǔ): 代表軟件InfoGrid, 它的優(yōu)點(diǎn)可以方便的利用圖結(jié)構(gòu)相關(guān)算法進(jìn)行計(jì)算。而缺點(diǎn)是要想得到結(jié)果必須進(jìn)行整個(gè)圖的計(jì)算, 而且遇到不適合的數(shù)據(jù)模型時(shí), 圖形數(shù)據(jù)庫(kù)很難使用。
五. NoSQL與關(guān)系型數(shù)據(jù)庫(kù)的區(qū)別
1. 存儲(chǔ)方式
1.1. 傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)采用表格的儲(chǔ)存方式, 數(shù)據(jù)以行和列的方式進(jìn)行存儲(chǔ), 要讀取和查詢都十分方便。而非關(guān)系型數(shù)據(jù)不適合這樣的表格存儲(chǔ)方式, 通常以數(shù)據(jù)集的方式, 大量的數(shù)據(jù)集中存儲(chǔ)在一起, 類似于鍵值對(duì)、圖結(jié)構(gòu)或者文檔。
2. 存儲(chǔ)結(jié)構(gòu)
2.1. 關(guān)系型數(shù)據(jù)庫(kù)按照結(jié)構(gòu)化的方法存儲(chǔ)數(shù)據(jù), 每個(gè)數(shù)據(jù)表都必須對(duì)各個(gè)字段定義好(也就是先定義好表的結(jié)構(gòu)), 再根據(jù)表的結(jié)構(gòu)存入數(shù)據(jù), 這樣做的好處就是由于數(shù)據(jù)的形式和內(nèi)容在存入數(shù)據(jù)之前就已經(jīng)定義好了, 所以整個(gè)數(shù)據(jù)表的可靠性和穩(wěn)定性都比較高, 但帶來(lái)的問(wèn)題就是一旦存入數(shù)據(jù)后, 如果需要修改數(shù)據(jù)表的結(jié)構(gòu)就會(huì)十分困難。而NoSQL數(shù)據(jù)庫(kù)由于面對(duì)的是大量非結(jié)構(gòu)化的數(shù)據(jù)的存儲(chǔ), 它采用的是動(dòng)態(tài)結(jié)構(gòu), 對(duì)于數(shù)據(jù)類型和結(jié)構(gòu)的改變非常的適應(yīng), 可以根據(jù)數(shù)據(jù)存儲(chǔ)的需要靈活的改變數(shù)據(jù)庫(kù)的結(jié)構(gòu)。
3. 存儲(chǔ)規(guī)范
3.1. 關(guān)系型數(shù)據(jù)庫(kù)為了避免重復(fù)、規(guī)范化數(shù)據(jù)以及充分利用好存儲(chǔ)空間, 把數(shù)據(jù)按照最小關(guān)系表的形式進(jìn)行存儲(chǔ), 這樣數(shù)據(jù)管理的就可以變得很清晰、一目了然, 當(dāng)然這主要是一張數(shù)據(jù)表的情況。如果是多張表情況就不一樣了, 由于數(shù)據(jù)涉及到多張數(shù)據(jù)表, 數(shù)據(jù)表之間存在著復(fù)雜的關(guān)系, 隨著數(shù)據(jù)表數(shù)量的增加, 數(shù)據(jù)管理會(huì)越來(lái)越復(fù)雜。而NoSQL數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)方式是用平面數(shù)據(jù)集的方式集中存放, 雖然會(huì)存在數(shù)據(jù)被重復(fù)存儲(chǔ), 從而造成存儲(chǔ)空間被浪費(fèi)的問(wèn)題(從當(dāng)前的計(jì)算機(jī)硬件的發(fā)展來(lái)看, 這樣的存儲(chǔ)空間浪費(fèi)的問(wèn)題微不足道), 但是由于基本上單個(gè)數(shù)據(jù)庫(kù)都是采用單獨(dú)存放的形式, 很少采用分割存放的方式, 所以這樣數(shù)據(jù)往往能存成一個(gè)整體, 這對(duì)于數(shù)據(jù)的讀寫(xiě)提供了極大的方便。
4. 擴(kuò)展方式
4.1. 當(dāng)前社會(huì)和科學(xué)飛速發(fā)展, 要支持日益增長(zhǎng)的數(shù)據(jù)庫(kù)存儲(chǔ)需求, 當(dāng)然要求數(shù)據(jù)庫(kù)有良好的擴(kuò)展性能, 并且要求數(shù)據(jù)庫(kù)支持更多數(shù)據(jù)并發(fā)量, 擴(kuò)展方式是NoSQL數(shù)據(jù)庫(kù)與關(guān)系型數(shù)據(jù)庫(kù)差別最大的地方, 由于關(guān)系型數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)表中, 數(shù)據(jù)操作的瓶頸出現(xiàn)在多張數(shù)據(jù)表的操作中, 而且數(shù)據(jù)表越多這個(gè)問(wèn)題越嚴(yán)重, 如果要緩解這個(gè)問(wèn)題, 只能提高處理能力, 也就是選擇速度更快性能更高的計(jì)算機(jī), 這樣的方法雖然可以拓展一定的空間, 但這樣拓展的空間是非常有限的, 也就是關(guān)系型數(shù)據(jù)庫(kù)只具備縱向擴(kuò)展能力。而NoSQL數(shù)據(jù)庫(kù)由于使用的是數(shù)據(jù)集的存儲(chǔ)方式, 它的存儲(chǔ)方式一定是分布式的, 它可以采用橫向的方式來(lái)開(kāi)展數(shù)據(jù)庫(kù), 也就是可以添加更多數(shù)據(jù)庫(kù)服務(wù)器到資源池, 然后由這些增加的服務(wù)器來(lái)負(fù)擔(dān)數(shù)據(jù)量增加的開(kāi)銷。
5. 查詢方式
5.1. 關(guān)系型數(shù)據(jù)庫(kù)采用結(jié)構(gòu)化查詢語(yǔ)言(即SQL)來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢, SQL早已獲得了各個(gè)數(shù)據(jù)庫(kù)廠商的支持, 成為數(shù)據(jù)庫(kù)行業(yè)的標(biāo)準(zhǔn), 它能夠支持?jǐn)?shù)據(jù)庫(kù)的CRUD(增加, 查詢, 更新, 刪除)操作, 具有非常強(qiáng)大的功能, SQL可以采用類似索引的方法來(lái)加快查詢操作。NoSQL數(shù)據(jù)庫(kù)使用的是非結(jié)構(gòu)化查詢語(yǔ)言(UnQL),它以數(shù)據(jù)集(像文檔)為單位來(lái)管理和操作數(shù)據(jù), 由于它沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn), 所以每個(gè)數(shù)據(jù)庫(kù)廠商提供產(chǎn)品標(biāo)準(zhǔn)是不一樣的, NoSQL中的文檔Id與關(guān)系型表中主鍵的概念類似, NoSQL數(shù)據(jù)庫(kù)采用的數(shù)據(jù)訪問(wèn)模式相對(duì)SQL更簡(jiǎn)單而精確。
6. 規(guī)范化
6.1. 在數(shù)據(jù)庫(kù)的設(shè)計(jì)開(kāi)發(fā)過(guò)程中開(kāi)發(fā)人員通常會(huì)面對(duì)同時(shí)需要對(duì)一個(gè)或者多個(gè)數(shù)據(jù)實(shí)體(包括數(shù)組、列表和嵌套數(shù)據(jù))進(jìn)行操作, 這樣在關(guān)系型數(shù)據(jù)庫(kù)中, 一個(gè)數(shù)據(jù)實(shí)體一般首先要分割成多個(gè)部分, 然后再對(duì)分割的部分進(jìn)行規(guī)范化, 規(guī)范化以后再分別存入到多張關(guān)系型數(shù)據(jù)表中, 這是一個(gè)復(fù)雜的過(guò)程。?好消息是隨著軟件技術(shù)的發(fā)展, 相當(dāng)多的軟件開(kāi)發(fā)平臺(tái)都提供一些簡(jiǎn)單的解決方法, 例如: 可以利用ORM層(也就是對(duì)象關(guān)系映射)來(lái)將數(shù)據(jù)庫(kù)中對(duì)象模型映射到基于SQL的關(guān)系型數(shù)據(jù)庫(kù)中去以及進(jìn)行不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。對(duì)于NoSQL數(shù)據(jù)庫(kù)則沒(méi)有這方面的問(wèn)題, 它不需要規(guī)范化數(shù)據(jù), 它通常是在一個(gè)單獨(dú)的存儲(chǔ)單元中存入一個(gè)復(fù)雜的數(shù)據(jù)實(shí)體。
7. 事務(wù)性
7.1. 關(guān)系型數(shù)據(jù)庫(kù)強(qiáng)調(diào)ACID規(guī)則, 原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability), 可以滿足對(duì)事務(wù)性要求較高或者需要進(jìn)行復(fù)雜數(shù)據(jù)查詢的數(shù)據(jù)操作, 而且可以充分滿足數(shù)據(jù)庫(kù)操作的高性能和操作穩(wěn)定性的要求。并且關(guān)系型數(shù)據(jù)庫(kù)十分強(qiáng)調(diào)數(shù)據(jù)的強(qiáng)一致性, 對(duì)于事務(wù)的操作有很好的支持。關(guān)系型數(shù)據(jù)庫(kù)可以控制事務(wù)原子性細(xì)粒度, 并且一旦操作有誤或者有需要可以馬上回滾事務(wù)。而NoSQL數(shù)據(jù)庫(kù)強(qiáng)調(diào)BASE原則, 基本可用(Basically Availble)、軟狀態(tài)(Soft-state)、最終一致性(Eventual Consistency), 它減少了對(duì)數(shù)據(jù)的強(qiáng)一致性支持, 從而獲得了基本一致性和柔性可靠性, 并且利用以上的特性達(dá)到了高可靠性和高性能, 最終達(dá)到了數(shù)據(jù)的最終一致性。NoSQL數(shù)據(jù)庫(kù)雖然對(duì)于事務(wù)操作也可以使用, 但由于它是一種基于節(jié)點(diǎn)的分布式數(shù)據(jù)庫(kù), 對(duì)于事務(wù)的操作不能很好的支持, 也很難滿足其全部的需求, 所以NoSQL數(shù)據(jù)庫(kù)的性能和優(yōu)點(diǎn)更多的體現(xiàn)在大數(shù)據(jù)的處理和數(shù)據(jù)庫(kù)的擴(kuò)展方面。 ?
8. 讀寫(xiě)性能
8.1. 關(guān)系型數(shù)據(jù)庫(kù)十分強(qiáng)調(diào)數(shù)據(jù)的一致性, 并為此降低讀寫(xiě)性能從而付出了巨大的代價(jià),雖然關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)和處理數(shù)據(jù)的可靠性很不錯(cuò), 但一旦面對(duì)海量數(shù)據(jù)的處理的時(shí)候效率就會(huì)變得很差, 特別是遇到高并發(fā)讀寫(xiě)的時(shí)候性能就會(huì)下降的非常厲害。 而NoSQL數(shù)據(jù)庫(kù)相對(duì)關(guān)系型數(shù)據(jù)庫(kù)優(yōu)勢(shì)最大的恰恰是應(yīng)對(duì)大數(shù)據(jù)方面, 也就是對(duì)于大量的每天都產(chǎn)生非結(jié)構(gòu)化的數(shù)據(jù)能夠高性能的讀寫(xiě), 這是因?yàn)镹oSQL數(shù)據(jù)庫(kù)是按key-value類型進(jìn)行存儲(chǔ)的, 以數(shù)據(jù)集的方式存儲(chǔ)的, 因此無(wú)論是擴(kuò)展還是讀寫(xiě)都非常容易, 并且NoSQL數(shù)據(jù)庫(kù)不需要關(guān)系型數(shù)據(jù)庫(kù)繁瑣的解析, 所以NoSQL數(shù)據(jù)庫(kù)大數(shù)據(jù)管理、檢索、讀寫(xiě)、分析以及可視化方面具有關(guān)系型數(shù)據(jù)庫(kù)不可比擬的優(yōu)勢(shì)。
9. 授權(quán)方式
9.1. 關(guān)系型數(shù)據(jù)庫(kù)常見(jiàn)的有Oracle、SQLServer、DB2、Mysql, 除了Mysql大多數(shù)的關(guān)系型數(shù)據(jù)庫(kù)如果要使用都需要支付一筆價(jià)格高昂的費(fèi)用, 即使是免費(fèi)的Mysql性能也受到了諸多的限制。而對(duì)于NoSQL數(shù)據(jù)庫(kù), 比較主流的有redis、HBase、MongoDb、Memcache等產(chǎn)品, 通常都采用開(kāi)源的方式, 不需要像關(guān)系型數(shù)據(jù)庫(kù)那樣, 需要一筆高昂的花費(fèi)。
六. 分布式數(shù)據(jù)庫(kù)
1. 所謂的分布式數(shù)據(jù)庫(kù)技術(shù), 就是數(shù)據(jù)庫(kù)技術(shù)與分布式技術(shù)的一種結(jié)合。具體指的是那些在地理意義上分散開(kāi)的各個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn), 在邏輯上又是屬于同一個(gè)系統(tǒng)的數(shù)據(jù)結(jié)合起來(lái)的一種數(shù)據(jù)庫(kù)技術(shù)。既有著數(shù)據(jù)庫(kù)間的協(xié)調(diào)性也有著數(shù)據(jù)的分布性。這個(gè)系統(tǒng)并不注重系統(tǒng)的集中控制, 而是注重每個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)的自治性, 此外為了讓程序員能夠在編寫(xiě)程序時(shí)可以減輕工作量以及系統(tǒng)出錯(cuò)的可能性, 一般都是完全不考慮數(shù)據(jù)的分布情況, 這樣的結(jié)果就使得系統(tǒng)數(shù)據(jù)的分布情況一直保持著透明性。
2. 在分布式數(shù)據(jù)庫(kù)里, 數(shù)據(jù)冗雜是一種被需要的特性, 這點(diǎn)和一般的集中式數(shù)據(jù)庫(kù)系統(tǒng)不一樣。第一點(diǎn)是為了提高局部的應(yīng)用性而要在那些被需要的數(shù)據(jù)庫(kù)節(jié)點(diǎn)復(fù)制數(shù)據(jù)。第二點(diǎn)是因?yàn)槿绻硞€(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)出現(xiàn)系統(tǒng)錯(cuò)誤, 在修復(fù)好之前, 可以通過(guò)操作其他的數(shù)據(jù)庫(kù)節(jié)點(diǎn)里復(fù)制好的數(shù)據(jù)來(lái)讓系統(tǒng)能夠繼續(xù)使用, 提高系統(tǒng)的有效性。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 002_Redis安装和卸载
- 下一篇: 003_Redis配置