【理論研究】數據庫基本知識與原理-01

數據庫作爲使用頻率最廣的中間件,作爲一個IT工程師,就算不打算從事數據庫開發或者做DBA,也應該掌握其基礎的知識、原理與基本的使用。

爲此,本篇開始,嘗試對數據庫的基本知識與原理進行講解。


數據庫的類型

關係型數據庫:以前,市面上最常見,使用最廣泛的數據庫,叫做關係型數據庫,例如大名鼎鼎的Oracle、SQL Server(微軟的,也叫MSSQL)、Mysql、DB2(IBM的),都是關係型的數據庫。由於它使用最廣泛、最常見,每個入門的人員都必須要掌握,因此接下來的幾篇《數據庫基本知識與原理》都會圍繞關係型數據庫先展開敘說,後面有機會再介紹No SQL的數據庫。

非關係型數據庫:叫作No SQL數據庫,其實只是個統稱,有各種的列式數據庫,KEY VALUE值的數據庫。



什麼是關係型數據庫?

關係型數據庫的本質就是一張張有關聯關係的二維表。

二維表意思就是有行與列組成的表格,與EXCEL表裏面的單個工作表(sheet)是一個意思。與EXCEL表裏面每個獨立的工作表唯一的不同,是關係型數據庫中的表格,都是有關聯關係的。

假設你的EXCEL表裏面有3個工作表分別叫A、B、C,如果表A有A1、A2、A3列且有內容,B表裏面有B1、B2、B3列且有內容、C也有C1、C2、C3列且有內容,而B2的每個單元格其實是從A2列對應行的單元格里面引用過來的,而C3的單元格也是從B3裏面引用過來的,那麼其實A、B、C三個表格就有關聯關係了。那麼這樣的EXCEL表就更加接近關係型數據庫裏面的表了。

只不過,數據庫裏面的,沒有規定B2的某個單元格一定要引用A2裏面對應行的單元格,可以是任意一行的單元格的值。


爲什麼要用數據庫?

爲什麼要用數據庫而不用EXCEL表?這是一個重要的問題。如果都不知道一個東西有什麼用,能解決什麼問題,那麼花時間學習一個新東西幹嘛?

首先,在數據量很少的情況下,直接用EXCEL表格也是沒有問題的。

但是當數據有2萬行左右的時候,發覺一臺K22的聯想筆記本用EXCEL來打開,可能都要7~8秒才能打開了,這基本上已經到達了用戶可以忍受的延遲時間的極限了,如果一個用戶打開一個網頁,7~8秒都打不開的話,估計他會選擇叉掉這個網頁,然後去其他網站去了。

因此,當數據量很大的時候,我們發覺EXCEL已經無法滿足我們的性能需求了,因此需要使用數據庫。


除了性能之外,使用普通的二維表,還有以下幾個問題:

數據冗餘:大量同樣的數據重複存儲,我們以下面一張很簡單的學生選課記錄表爲例。

序號學號學生姓名性別聯繫電話課程名稱授課老師
12019063001張三13900000001語文孫七
22019063001張三13900000001數學周八
32019063001張三13900000001英語吳九
42019063002李四13900000002語文孫七
52019063002李四13900000002數學周八
62019063003王五13900000003數學周八
72019063003王五13900000003英語吳九
82019063004趙六13900000004體育鄭十

看到“張三”選了“語文、數學、英語”3門課程,但是“張三”每選修一門課程,他的“學號”、“性別”、“聯繫電話”等數據就會被重複存儲1次,如果有100條關於他的記錄,這些數據就會被重複100次。這樣的數據冗餘會帶來如下問題:

1)浪費存儲空間。

2)導致增加了檢索有效數據的時長(因爲數據總量增多了,搜索的時候遍歷的數據增多了)。


刪除異常:想刪除1個數據,結果會導致不想刪的數據也被刪除了。(依然以上述例子爲例)

序號學號學生姓名性別聯繫電話課程名稱授課老師
82019063004趙六13900000004體育鄭十

如果“趙六”退學了,我們想要刪除趙六的數據,但是我們會發現只有“趙六”選修了體育課。

這時候一旦刪除了“趙六”,“體育”的課程,“鄭十”這位授課老師,都會無故從這個表格被刪掉,這就叫刪除異常。


修改異常:修改一個數據,卻需要修改多次,並且如果修改不安全,會導致數據不一致。

序號學號學生姓名性別聯繫電話課程名稱授課老師
12019063001張三13900000001語文孫七
22019063001張三13900000001數學周八
32019063001張三13900000001英語吳九

如果“張三”更換了手機,修改手機號,張三有多少條記錄就需要修改多少次,寫入操作的開銷是大於讀操作的,會帶了額外增加的開銷,並且如果修改不完全,會導致表格中“張三”的聯繫電話不一致。


插入異常:應該插入的數據無法插入。

序號學號學生姓名性別聯繫電話課程名稱授課老師





生物張強


數據庫是怎樣處理上面數據的?

數據庫會將上面的一張二維表,拆分爲多張具有關聯關係的二維表進行存儲。注意關鍵詞有2個,1是多張,2是有關聯關係。如下:

1)先將1張二維表拆分爲多張二維表

學生表
序號學號學生姓名性別聯繫電話
12019063001張三13900000001
22019063002李四13900000002
32019063003王五13900000003
42019063004趙六13900000004


課程表
序號課程ID課程名稱
10001語文
20002數學
30003英語
40004體育



老師表
序號老師ID老師姓名
1T0001孫七
2T0002周八
3T0003吳九
4T0004鄭十

2)爲上面獨立的表格,創建關聯關係,使得他們之間關聯起來

選課記錄表
序號學號課程ID
1139000000010001
2139000000010002
3139000000010003
4139000000020001
5139000000020002
6139000000030002
7139000000030003
8139000000040004


授課記錄表
序號學號課程ID
10001T0001
20002T0002
30003T0003
40004T0004


按照上述處理,有什麼效果?

1張表,拆成了上面的5張表,好像把簡單的問題複雜化了。弄這麼複雜,到底有什麼作用呢?解決了什麼問題?

1、解決數據冗餘:

再看一下學生表,同一個學生的信息只存儲了一次,節省了空間、提升了查找性能,解決了數據冗餘的問題。


2、解決刪除異常:

再看一下學生表,如果此時“趙六”退學,需要刪除“學生表”的“趙六”數據,此外,與“學生表”的“學號”字段有關聯關係的“選課記錄表”,會自動刪除“趙六”學號(2019063004)的行,即第8行,就完成操作了。而“體育課”與體育課的授課老師“鄭十”數據會完整保留在“課程表”與“老師表”中,不會被異常刪除,解決了刪除異常的問題。


3、解決修改異常:

現在“趙六”更換了手機,只需要在學生表中,更新“趙六”-“聯繫電話”的字段,其他表格根本沒有保存這個信息,也就是說只需要進行一次的寫操作就完成了,不會出現數據不一致或者多次寫操作,解決了修改異常。


4、解決插入異常:

如果現在新增了“政治課”,沒有授課老師與選修的學生,只需要在課程表裏面增加一行記錄“政治課”就可以了,其他表格需要寫入。不會出現像之前沒有授課老師或者沒有選修學生,連新增的課程都無法插入的問題,解決了插入異常。


綜上,我們需要使用數據庫,來解決上面幾個普通二維表無法解決的問題。


上面說的,大部分都是功能上需要使用數據庫的原因,下一篇我們再來討論一下從性能上,爲啥要使用數據庫。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章