開源數(shù)據(jù)庫這么多,你知道幾種
數(shù)據(jù)庫從字面上的理解就是數(shù)據(jù)的倉庫,其實(shí)我們平時說的數(shù)據(jù)庫是指數(shù)據(jù)庫管理系統(tǒng)(Database Management System),它是一種操縱和管理數(shù)據(jù)庫的大型軟件,用于建立、使用和維護(hù)數(shù)據(jù)庫,簡稱DBMS。嚴(yán)格來說數(shù)據(jù)庫是數(shù)據(jù)庫管理系統(tǒng)的實(shí)例,一個數(shù)據(jù)庫管理系統(tǒng)可以有多個數(shù)據(jù)庫實(shí)例。
數(shù)據(jù)庫種類很多,我們平時接觸最多的恐怕就是Oracle數(shù)據(jù)庫,或者M(jìn)ySQL數(shù)據(jù)。兩者是應(yīng)用最廣泛的關(guān)系型數(shù)據(jù)。如圖1是2018年12月份使用情況排名,從排名也可以看出上述兩個數(shù)據(jù)庫分別排***名和第二名。
圖1 數(shù)據(jù)庫排名
數(shù)據(jù)庫的分類
如果仔細(xì)看圖1的排名就可以看到,數(shù)據(jù)庫不僅僅有我們平時學(xué)到的關(guān)系型數(shù)據(jù)庫,還有鍵值(Key-Value)數(shù)據(jù)庫、列存儲數(shù)據(jù)庫、文檔數(shù)據(jù)庫和搜索引擎等類型。下面本文將簡單介紹一下各種類型的數(shù)據(jù)。
關(guān)系型數(shù)據(jù)庫: 這種類型的數(shù)據(jù)庫是最古老的數(shù)據(jù)庫類型,關(guān)系型數(shù)據(jù)庫模型是把復(fù)雜的數(shù)據(jù)結(jié)構(gòu)歸結(jié)為簡單的二元關(guān)系(即二維表格形式), 如圖2是一個二維表的實(shí)例。通常該表***行為字段名稱,描述該字段的作用,下面是具體的數(shù)據(jù)。在定義該表時需要指定字段的名稱及類型。
圖2 數(shù)據(jù)庫表實(shí)例
在關(guān)系型數(shù)據(jù)庫中,對數(shù)據(jù)的操作幾乎全部建立在一個或多個關(guān)系表格上。在大型系統(tǒng)中通常有多個表,且表之間有各種關(guān)系。實(shí)際使用就是通過對這些關(guān)聯(lián)的表格分類、合并、連接或選取等運(yùn)算來實(shí)現(xiàn)數(shù)據(jù)庫的管理。
鍵值存儲數(shù)據(jù)庫:鍵值數(shù)據(jù)庫是一種非關(guān)系數(shù)據(jù)庫,它使用簡單的鍵值方法來存儲數(shù)據(jù)。鍵值數(shù)據(jù)庫將數(shù)據(jù)存儲為鍵值對集合,其中鍵作為唯一標(biāo)識符。
圖2 鍵值數(shù)據(jù)庫基本原理
如圖2是某公有云的鍵值存儲示意圖,其中鍵包含分區(qū)鍵和排序鍵,而值包含更多的實(shí)際信息。比如實(shí)際使用是可以以學(xué)號為鍵,姓名、性別、年齡和班級等信息為值進(jìn)行存儲。實(shí)際存儲形式很靈活,是業(yè)務(wù)需求自行定義即可。
列存儲數(shù)據(jù)庫:列式存儲(column-based)是相對于傳統(tǒng)關(guān)系型數(shù)據(jù)庫的行式存儲(Row-basedstorage)來說的。簡單來說兩者的區(qū)別就是對表中數(shù)據(jù)的存儲形式的差異。
圖3 列存儲數(shù)據(jù)
如圖3是傳統(tǒng)行數(shù)據(jù)庫和列數(shù)據(jù)庫表中數(shù)據(jù)在磁盤上的存儲形式的差異對比。對于行存儲數(shù)據(jù)庫,表中的數(shù)據(jù)是以行為單位逐行存儲在磁盤上的;而對于列存儲數(shù)據(jù)庫,表中的數(shù)據(jù)則是以列為單位逐列存儲在磁盤中。
列存儲解決的主要問題是數(shù)據(jù)查詢問題。我們知道,平時的查詢大部分都是條件查詢,通常是返回某些字段(列)的數(shù)據(jù)。對于行存儲數(shù)據(jù),數(shù)據(jù)讀取時通常將一行數(shù)據(jù)完全讀出,如果只需要其中幾列數(shù)據(jù)的情況,就會存在冗余列,出于縮短處理時間的考量,消除冗余列的過程通常是在內(nèi)存中進(jìn)行的。而列存儲,每次讀取的數(shù)據(jù)是集合的一段或者全部,不存在冗余性問題。這樣,通過這種存儲方式的調(diào)整,使得查詢性能得到極大的提升。
面向文檔數(shù)據(jù)庫:此類數(shù)據(jù)庫可存放并獲取文檔,可以是XML、JSON、BSON等格式,這些文檔具備可述性(self-describing),呈現(xiàn)分層的樹狀結(jié)構(gòu)(hierarchical tree data structure),可以包含映射表、集合和純量值。數(shù)據(jù)庫中的文檔彼此相似,但不必完全相同。文檔數(shù)據(jù)庫所存放的文檔,就相當(dāng)于鍵值數(shù)據(jù)庫所存放的“值”。文檔數(shù)據(jù)庫可視為其值可查的鍵值數(shù)據(jù)庫。
圖形數(shù)據(jù)庫:圖形數(shù)據(jù)庫顧名思義,就是一種存儲圖形關(guān)系的數(shù)據(jù)庫。圖形數(shù)據(jù)庫是NoSQL數(shù)據(jù)庫的一種類型,它應(yīng)用圖形理論存儲實(shí)體之間的關(guān)系信息。關(guān)系型數(shù)據(jù)用于存儲明確關(guān)系的數(shù)據(jù),但對于復(fù)雜關(guān)系的數(shù)據(jù)存儲卻有些力不從心。如圖4這種人物之間的關(guān)系,如果用關(guān)系型數(shù)據(jù)庫則非常復(fù)雜,用圖形數(shù)據(jù)庫將非常簡單。
圖4 圖形數(shù)據(jù)庫示例
搜索引擎存儲:搜索引擎數(shù)據(jù)庫是應(yīng)用在搜索引擎領(lǐng)域的數(shù)據(jù)存儲形式,由于搜索引擎會爬取大量的數(shù)據(jù),并以特定的格式進(jìn)行存儲,這樣在檢索的時候才能保證性能***。
不同類型數(shù)據(jù)庫軟件
關(guān)系型數(shù)據(jù)庫: 關(guān)系型數(shù)據(jù)庫最為經(jīng)典的開源軟件就是MySQL,它***的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是***的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。
SUN被甲骨文收購后,MySQL 的原創(chuàng)人員有拉出另外一個分支,命名MariaDB 。該數(shù)據(jù)庫被維基百科,F(xiàn)acebook 甚至 Google 等技術(shù)巨頭使用。 MariaDB 是一種可為 MySQL 提供插件替換功能的數(shù)據(jù)庫服務(wù)器。開發(fā)人員的首要關(guān)注點(diǎn)是安全性,在每個版本發(fā)布時,開發(fā)人員還會合并所有 MySQL 的安全修補(bǔ)程序,并在需要時對其進(jìn)行增強(qiáng)。
除此之外,還有很多開源的關(guān)系型數(shù)據(jù)庫,比如經(jīng)典的文件數(shù)據(jù)庫SQLite和針對Web服務(wù)進(jìn)行優(yōu)化的CUBRID 等。
鍵值存儲數(shù)據(jù)庫:鍵值數(shù)據(jù)庫目前應(yīng)用最多的應(yīng)該是Redis,Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。Redis通常最為普通關(guān)系型數(shù)據(jù)庫的緩存層,用于降低數(shù)據(jù)庫的訪問壓力,提升系統(tǒng)性能。
列存儲數(shù)據(jù)庫:列存儲數(shù)據(jù)庫中最為出名的恐怕就是HBase了,HBase是 BigTable 的開源 java 版本。是建立在 HDFS 之上,提供高可靠性、高性能、列存儲、 可伸縮、實(shí)時讀寫 NoSQL 的數(shù)據(jù)庫系統(tǒng)。
面向文檔數(shù)據(jù)庫:文檔數(shù)據(jù)庫種類繁多,包括MongoDB、CouchDB、 Terrastore、RavenDB和OrientDB等多大十幾個。其中MongoDB是目前最為流行的文檔數(shù)據(jù)庫,其介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。其***的特點(diǎn)是分布式部署,可以隨著負(fù)載的增大動態(tài)擴(kuò)容,從而滿足企業(yè)業(yè)務(wù)增長的需求。
圖形數(shù)據(jù)庫:圖形種類很多,比如Neo4J、ArangoDB、OrientDB、FlockDB、GraphDB、InfiniteGraph、Titan和Cayley等。其中Neo4j 是目前***的圖形數(shù)據(jù)庫,支持完整的事務(wù),在屬性圖中,圖是由頂點(diǎn)(Vertex),邊(Edge)和屬性(Property)組成的,頂點(diǎn)和邊都可以設(shè)置屬性,頂點(diǎn)也稱作節(jié)點(diǎn),邊也稱作關(guān)系,每個節(jié)點(diǎn)和關(guān)系都可以由一個或多個屬性。Neo4j創(chuàng)建的圖是用頂點(diǎn)和邊構(gòu)建一個有向圖,其查詢語言cypher已經(jīng)成為事實(shí)上的標(biāo)準(zhǔn)。
搜索引擎存儲:搜索引擎數(shù)據(jù)庫最近比較火的包括Solr和Elasticsearch等。Solr是Apache 的一個開源項目,基于業(yè)界大名鼎鼎的java開源搜索引擎Lucene。在過去的十年里,solr發(fā)展壯大,擁有廣泛的用戶群體。solr提供分布式索引、分片、副本集、負(fù)載均衡和自動故障轉(zhuǎn)移和恢復(fù)功能。如果正確部署,良好管理,solr就能夠成為一個高可靠、可擴(kuò)展和高容錯的搜索引擎。
Elasticsearch構(gòu)建在Apache Lucene庫之上,同是開源搜索引擎。Elasticsearch在Solr推出幾年后才面世的,通過REST和schema-free的JSON文檔提供分布式、多租戶全文搜索引擎。并且官方提供Java,Groovy,PHP,Ruby,Perl,Python,.NET和Javascript客戶端。目前Elasticsearch與Logstash和Kibana配合,部署成日志采集和分析,簡稱ELK,它們都是開源軟件。最近新增了一個FileBeat,它是一個輕量級的日志收集處理工具(Agent),F(xiàn)ilebeat占用資源少,適合于在各個服務(wù)器上搜集日志后傳輸給Logstash。