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