從本篇起,咱們就開始對『數據庫』相關概念內容的介紹,除了介紹基本的名詞概念以及他們的使用狀況外,咱們還會深刻到源碼層面去探究一些底層實現,例如索引、視圖、觸發器等技術在數據庫引擎層是如何支持的。java
那麼第一篇,咱們將針對『數據庫』作一個最基本的介紹,弄清楚什麼是數據庫?數據庫的類型有哪些?以及使用數據庫解決了哪些已知問題?等等。git
數據庫概念的演變與誕生經歷了漫長的發展過程,從最開始的人工管理,到文件系統,再到數據庫系統。每個階段的到來都伴隨着新的技術突破。程序員
人工管理github
20 世紀 50 年代,那是尚未誕生操做系統,計算機只是用於進行大規模複雜運算的機器,全部的數據都是經過外部磁帶、卡帶手工存儲。數據庫
致使的問題是,數據只歸屬於某一個程序,數據沒有結構之分,全部的數據都以二進制的方式順序存儲在物理存儲設備上,讀取時也只能以固定的字節數進行讀取,不然就會數據錯亂。緩存
除此以外的是,人工管理下的程序員工做量巨大。安全
文件系統微信
再日後,操做系統與磁盤的誕生使得數據管理進入了新的階段,操做系統中實現了專門處理數據管理的模塊,能夠將虛擬文件映射到磁盤等實際物理設備上。數據結構
咱們再也不須要直接面對二進制,轉而能夠經過操做系統對數據進行簡單的文件讀寫,管理數據更加方便了。併發
數據庫系統
爲了解決多應用、多用戶高度共享數據,數據存儲的結構化、以及數據的多樣化查詢和保存,誕生了數據庫系統。
數據庫相比於文件系統具備以下特色:
結構化的數據存儲意味着咱們能夠結合面向對象的思想定製化咱們程序使用的數據,更方便的讀取存儲。
專門的數據庫管理系統意味着多程序、多用戶訪問下,仍然能控制並保證數據庫中數據的安全性與完整性。
有關數據庫和數據庫管理系統之間的區別聯繫,咱們後文還會作詳盡的解釋。
有關數據庫技術這塊,涉及到幾個概念相對容易混淆,這裏做一下區分。
第一,什麼是數據庫?
維基百科上是這樣定義的:
所謂「數據庫」系以必定方式儲存在一塊兒、能予多個用戶共享、具備儘量小的冗餘度、與應用程序彼此獨立的數據集合。一個數據庫由多個表空間(Tablespace)構成。
好,這個不難理解,數據庫就是一個存儲結構化數據的倉庫。
第二,什麼是數據庫管理系統?
維基百科這樣說:
數據庫管理系統(英語:Database Management System,簡稱DBMS)是爲管理數據庫而設計的電腦軟件系統,通常具備存儲、截取、安全保障、備份等基礎功能。
看似差很少,都能讀取存儲數據,但實際上他們是上下級關係。
數據庫用於存儲數據,提供基本的數據查詢保存等功能,而數據庫管理系統則是在此基礎之上封裝了額外的功能。
例如:數據的備份與導出,安全訪問攔截,甚至使用一個可視化的點擊操做映射了基本的命令操做。
簡單一句話,數據庫管理系統是爲了咱們更方便的使用數據庫而誕生的。
接着咱們看一個很重要的點,不少人甚至那些使用數據庫不少年的程序員都從未了解過的知識。
在不少人眼裏,就只知道 MySQL,SQLServer,Oracle,聽過 Sybase 和 DB2 的人或許都很少,但實際上這些都只是關係型數據庫這一種數據庫類型的實現者,數據庫其實有不少類型。
數據庫類型的區分主要參照的指標是數據的存儲模型,而經常使用的數據模型其實有不少:
因爲關係模型在很長一段時間內成爲主流的數據模型,因此咱們也習慣性將數據庫類型分爲兩類,關係型數據庫和非關係型數據庫。
關係型數據庫
這是咱們目前至今主流的數據庫類型,其對應的數據存儲模型就是關係型模型,數據以表格形式存儲,字段關聯數據。
二維表結構是很是貼近邏輯世界的一個概念,它更容易理解,這是關係型數據庫可以成爲主流的其中一個重要緣由。經過 SQL 進行表與表之間的聯接查詢很是的方便天然。
缺點也是很顯而易見的,海量數據下,對一張表的查詢會顯得很力不從心,就是由於數據的存儲不具有特殊的數據結構,例若有些非關係型數據庫的數據存儲結構是相似樹的結構,就使得查詢上具備自然的優點。
因此我的認爲,雖然如今是關係型數據庫的天下,但相信之後會出現一些優秀的非關係型數據庫取代傳統的關係型數據庫。由於之後必然是大數據的時代,那麼海量數據下,傳統的關係型數據的效率問題就會被逐漸放大。
非關係型數據庫
非關係型數據庫也被稱爲 NoSQL 數據庫,NoSQL 並非某個具體數據庫,它泛指全部非關係型數據庫。
非關係型數據庫種類有不少,咱們列舉其中較爲流行的幾種。
一、鍵值(Key-Value)存儲數據庫
鍵值數據庫主要是使用一個哈希表,個表中有一個特定的鍵和一個指針指向特定的數據。Key/value 模型的鍵值數據庫的優點在於,經過鍵的 hash 碼能夠快速查詢到 value,而且可以應對高併發。
市面上成熟的產品有,Memcached、Redis、MemcacheDB、Berkeley DB。前兩個可能比較有名,作緩存的數據庫。
二、列存儲(Column-oriented)數據庫
列存儲數據庫又被稱爲面向可擴展性的分佈式數據庫,它反轉了傳統的行存儲數據庫。
傳統的行存儲數據庫:
列存儲數據庫:
由於是以列字段做爲做爲表格的行,那麼同一行記錄取的就是該表中全部記錄的的某一個列數據集合,必然是同一類型的數據,要麼都是 int 類型,要麼都是 varchar 類型。
行存儲若是要去表中某一列的全部數據集合,就會複雜的多,因此在大部分場景下,列存儲的解析過程更有利於分析大數據的數據分析。
固然了,這只是其中一個區別,他們之間的優劣對比有不少個方面,這裏不可能都進行列舉,大家能夠自行去搜索瞭解。
最典型的產品應用就是,Hbase,大數據存儲用的很是多。
三、面向文檔數據庫
文檔數據庫是一種非關係數據庫,旨在將半結構化數據存儲爲文檔,其中文檔包括 XML、YAML、JSON、BSON、office 文檔等。
簡而言之,就是將數據保存到以上相似格式的文檔中,數據庫中的每一個記錄都是以文檔形式存在的,相互之間再也不存在關聯關係。
典型的應用就是,MongoDB、CouchDB。
至此,對於數據庫你也應當有一個基本的認識了,起碼得知道它是什麼?用來解決什麼問題?具備哪些類型?各自類型下面的主流實現者有哪些?
本篇可能很是的枯燥,由於都是理論性的解釋,下一篇咱們講講 Sql 語句。