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