您好,登錄后才能下訂單哦!
數據庫作為使用頻率最廣的中間件,作為一個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已經無法滿足我們的性能需求了,因此需要使用數據庫。
除了性能之外,使用普通的二維表,還有以下幾個問題:
數據冗余:大量同樣的數據重復存儲,我們以下面一張很簡單的學生選課記錄表為例。
序號 | 學號 | 學生姓名 | 性別 | 聯系電話 | 課程名稱 | 授課老師 |
1 | 2019063001 | 張三 | 男 | 13900000001 | 語文 | 孫七 |
2 | 2019063001 | 張三 | 男 | 13900000001 | 數學 | 周八 |
3 | 2019063001 | 張三 | 男 | 13900000001 | 英語 | 吳九 |
4 | 2019063002 | 李四 | 男 | 13900000002 | 語文 | 孫七 |
5 | 2019063002 | 李四 | 男 | 13900000002 | 數學 | 周八 |
6 | 2019063003 | 王五 | 女 | 13900000003 | 數學 | 周八 |
7 | 2019063003 | 王五 | 女 | 13900000003 | 英語 | 吳九 |
8 | 2019063004 | 趙六 | 女 | 13900000004 | 體育 | 鄭十 |
看到“張三”選了“語文、數學、英語”3門課程,但是“張三”每選修一門課程,他的“學號”、“性別”、“聯系電話”等數據就會被重復存儲1次,如果有100條關于他的記錄,這些數據就會被重復100次。這樣的數據冗余會帶來如下問題:
1)浪費存儲空間。
2)導致增加了檢索有效數據的時長(因為數據總量增多了,搜索的時候遍歷的數據增多了)。
刪除異常:想刪除1個數據,結果會導致不想刪的數據也被刪除了。(依然以上述例子為例)
序號 | 學號 | 學生姓名 | 性別 | 聯系電話 | 課程名稱 | 授課老師 |
8 | 2019063004 | 趙六 | 女 | 13900000004 | 體育 | 鄭十 |
如果“趙六”退學了,我們想要刪除趙六的數據,但是我們會發現只有“趙六”選修了體育課。
這時候一旦刪除了“趙六”,“體育”的課程,“鄭十”這位授課老師,都會無故從這個表格被刪掉,這就叫刪除異常。
修改異常:修改一個數據,卻需要修改多次,并且如果修改不安全,會導致數據不一致。
序號 | 學號 | 學生姓名 | 性別 | 聯系電話 | 課程名稱 | 授課老師 |
1 | 2019063001 | 張三 | 男 | 13900000001 | 語文 | 孫七 |
2 | 2019063001 | 張三 | 男 | 13900000001 | 數學 | 周八 |
3 | 2019063001 | 張三 | 男 | 13900000001 | 英語 | 吳九 |
如果“張三”更換了手機,修改手機號,張三有多少條記錄就需要修改多少次,寫入操作的開銷是大于讀操作的,會帶了額外增加的開銷,并且如果修改不完全,會導致表格中“張三”的聯系電話不一致。
插入異常:應該插入的數據無法插入。
序號 | 學號 | 學生姓名 | 性別 | 聯系電話 | 課程名稱 | 授課老師 |
生物 | 張強 |
數據庫是怎樣處理上面數據的?
數據庫會將上面的一張二維表,拆分為多張具有關聯關系的二維表進行存儲。注意關鍵詞有2個,1是多張,2是有關聯關系。如下:
1)先將1張二維表拆分為多張二維表
學生表 | ||||
序號 | 學號 | 學生姓名 | 性別 | 聯系電話 |
1 | 2019063001 | 張三 | 男 | 13900000001 |
2 | 2019063002 | 李四 | 男 | 13900000002 |
3 | 2019063003 | 王五 | 女 | 13900000003 |
4 | 2019063004 | 趙六 | 女 | 13900000004 |
課程表 | ||
序號 | 課程ID | 課程名稱 |
1 | 0001 | 語文 |
2 | 0002 | 數學 |
3 | 0003 | 英語 |
4 | 0004 | 體育 |
老師表 | ||
序號 | 老師ID | 老師姓名 |
1 | T0001 | 孫七 |
2 | T0002 | 周八 |
3 | T0003 | 吳九 |
4 | T0004 | 鄭十 |
2)為上面獨立的表格,創建關聯關系,使得他們之間關聯起來
選課記錄表 | ||
序號 | 學號 | 課程ID |
1 | 13900000001 | 0001 |
2 | 13900000001 | 0002 |
3 | 13900000001 | 0003 |
4 | 13900000002 | 0001 |
5 | 13900000002 | 0002 |
6 | 13900000003 | 0002 |
7 | 13900000003 | 0003 |
8 | 13900000004 | 0004 |
授課記錄表 | ||
序號 | 學號 | 課程ID |
1 | 0001 | T0001 |
2 | 0002 | T0002 |
3 | 0003 | T0003 |
4 | 0004 | T0004 |
按照上述處理,有什么效果?
1張表,拆成了上面的5張表,好像把簡單的問題復雜化了。弄這么復雜,到底有什么作用呢?解決了什么問題?
1、解決數據冗余:
再看一下學生表,同一個學生的信息只存儲了一次,節省了空間、提升了查找性能,解決了數據冗余的問題。
2、解決刪除異常:
再看一下學生表,如果此時“趙六”退學,需要刪除“學生表”的“趙六”數據,此外,與“學生表”的“學號”字段有關聯關系的“選課記錄表”,會自動刪除“趙六”學號(2019063004)的行,即第8行,就完成操作了。而“體育課”與體育課的授課老師“鄭十”數據會完整保留在“課程表”與“老師表”中,不會被異常刪除,解決了刪除異常的問題。
3、解決修改異常:
現在“趙六”更換了手機,只需要在學生表中,更新“趙六”-“聯系電話”的字段,其他表格根本沒有保存這個信息,也就是說只需要進行一次的寫操作就完成了,不會出現數據不一致或者多次寫操作,解決了修改異常。
4、解決插入異常:
如果現在新增了“政治課”,沒有授課老師與選修的學生,只需要在課程表里面增加一行記錄“政治課”就可以了,其他表格需要寫入。不會出現像之前沒有授課老師或者沒有選修學生,連新增的課程都無法插入的問題,解決了插入異常。
綜上,我們需要使用數據庫,來解決上面幾個普通二維表無法解決的問題。
上面說的,大部分都是功能上需要使用數據庫的原因,下一篇我們再來討論一下從性能上,為啥要使用數據庫。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。