第01章_資料庫概述
第01章_資料庫概述
講師:尚矽谷-宋紅康(江湖人稱:康師傅)
1. 為什麼要使用資料庫
- 持久化(persistence):把資料儲存到可掉電式儲存裝置中以供之後使用。大多數情況下,特別是企業級應用,資料持久化意味著將記憶體中的資料儲存到硬碟上加以”固化”,而持久化的實現過程大多通過各種關係資料庫來完成。
- 持久化的主要作用是將記憶體中的資料儲存在關係型資料庫中,當然也可以儲存在磁碟檔案、XML資料檔案中。
生活中的例子:
2. 資料庫與資料庫管理系統
2.1 資料庫的相關概念
DB:資料庫(Database) |
---|
即儲存資料的“倉庫”,其本質是一個檔案系統。它儲存了一系列有組織的資料。 |
DBMS:資料庫管理系統(Database Management System) |
是一種操縱和管理資料庫的大型軟體,用於建立、使用和維護資料庫,對資料庫進行統一管理和控制。使用者通過資料庫管理系統訪問資料庫中表內的資料。 |
SQL:結構化查詢語言(Structured Query Language) |
專門用來與資料庫通訊的語言。 |
2.2 資料庫與資料庫管理系統的關係
資料庫管理系統(DBMS)可以管理多個數據庫,一般開發人員會針對每一個應用建立一個數據庫。為儲存應用中實體的資料,一般會在資料庫建立多個表,以儲存程式中實體使用者的資料。
資料庫管理系統、資料庫和表的關係如圖所示:
2.3 常見的資料庫管理系統排名(DBMS)
目前網際網路上常見的資料庫管理軟體有Oracle、MySQL、MS SQL Server、DB2、PostgreSQL、Access、Sybase、Informix這幾種。以下是2021年DB-Engines Ranking 對各資料庫受歡迎程度進行調查後的統計結果:(檢視資料庫最新排名:https://db-engines.com/en/ranking)
。。。
對應的走勢圖:(https://db-engines.com/en/ranking_trend)
2.4 常見的資料庫介紹
Oracle
1979 年,Oracle 2 誕生,它是第一個商用的 RDBMS(關係型資料庫管理系統)。隨著 Oracle 軟體的名氣越來越大,公司也改名叫 Oracle 公司。
2007年,總計85億美金收購BEA Systems。
2009年,總計74億美金收購SUN。此前的2008年,SUN以10億美金收購MySQL。意味著Oracle 同時擁有了 MySQL 的管理權,至此 Oracle 在資料庫領域中成為絕對的領導者。
2013年,甲骨文超越IBM,成為繼Microsoft後全球第二大軟體公司。
如今 Oracle 的年收入達到了 400 億美金,足以證明商用(收費)資料庫軟體的價值。
SQL Server
SQL Server 是微軟開發的大型商業資料庫,誕生於 1989 年。C#、.net等語言常使用,與WinNT完全整合,也可以很好地與Microsoft BackOffice產品整合。
DB2
IBM公司的資料庫產品,收費的。常應用在銀行系統中。
PostgreSQL
PostgreSQL 的穩定性極強,最符合SQL標準,開放原始碼,具備商業級DBMS質量。PG對資料量大的文字以及SQL處理較快。
SyBase
已經淡出歷史舞臺。提供了一個非常專業資料建模的工具PowerDesigner。
SQLite
嵌入式的小型資料庫,應用在手機端。 零配置,SQlite3不用安裝,不用配置,不用啟動,關閉或者配置資料庫例項。當系統崩潰後不用做任何恢復操作,再下次使用資料庫的時候自動恢復。
informix
IBM公司出品,取自Information 和Unix的結合,它是第一個被移植到Linux上的商業資料庫產品。僅運行於unix/linux平臺,命令列操作。 效能較高,支援叢集,適應於安全性要求極高的系統,尤其是銀行,證券系統的應用。
3. MySQL介紹
3.1 概述
- MySQL是一個
開放原始碼的關係型資料庫管理系統
,由瑞典MySQL AB(創始人Michael Widenius)公司1995年開發,迅速成為開源資料庫的 No.1。 - 2008被
Sun
收購(10億美金),2009年Sun被Oracle
收購。MariaDB
應運而生。(MySQL 的創造者擔心 MySQL 有閉源的風險,因此建立了 MySQL 的分支專案 MariaDB) - MySQL6.x 版本之後分為
社群版
和商業版
。 - MySQL是一種關聯資料庫管理系統,將資料儲存在不同的表中,而不是將所有資料放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
- MySQL是開源的,所以你不需要支付額外的費用。
- MySQL是可以定製的,採用了
GPL(GNU General Public License)
協議,你可以修改原始碼來開發自己的MySQL系統。 - MySQL支援大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
- MySQL支援大型資料庫,支援5000萬條記錄的資料倉庫,32位系統表文件最大可支援
4GB
,64位系統支援最大的表文件為8TB
。 - MySQL使用
標準的SQL資料語言
形式。 - MySQL可以允許運行於多個系統上,並且支援多種語言。這些程式語言包括C、C++、Python、Java、Perl、PHP和Ruby等。
3.2 MySQL發展史重大事件
MySQL的歷史就是整個網際網路的發展史。網際網路業務從社交領域、電商領域到金融領域的發展,推動著應用對資料庫的需求提升,對傳統的資料庫服務能力提出了挑戰。高併發、高效能、高可用、輕資源、易維護、易擴充套件的需求,促進了MySQL的長足發展。
1.4 關於MySQL 8.0
MySQL從5.7版本直接跳躍釋出了8.0版本
,可見這是一個令人興奮的里程碑版本。MySQL 8版本在功能上做了顯著的改進與增強,開發者對MySQL的原始碼進行了重構,最突出的一點是多MySQL Optimizer優化器進行了改進。不僅在速度上得到了改善,還為使用者帶來了更好的效能和更棒的體驗。
1.5 Why choose MySQL?
為什麼如此多的廠商要選用MySQL?大概總結的原因主要有以下幾點:
-
開放原始碼,使用成本低。
-
效能卓越,服務穩定。
-
軟體體積小,使用簡單,並且易於維護。
-
歷史悠久,社群使用者非常活躍,遇到問題可以尋求幫助。
-
許多網際網路公司在用,經過了時間的驗證。
1.6 Oracle vs MySQL
Oracle 更適合大型跨國企業的使用,因為他們對費用不敏感,但是對效能要求以及安全性有更高的要求。
MySQL 由於其體積小、速度快、總體擁有成本低,可處理上千萬條記錄的大型資料庫,尤其是開放原始碼這一特點,使得很多網際網路公司、中小型網站選擇了MySQL作為網站資料庫(Facebook,Twitter,YouTube,阿里巴巴/螞蟻金服,去哪兒,美團外賣,騰訊)。
4. RDBMS 與 非RDBMS
從排名中我們能看出來,關係型資料庫絕對是 DBMS 的主流,其中使用最多的 DBMS 分別是 Oracle、MySQL 和 SQL Server。這些都是關係型資料庫(RDBMS)。
4.1 關係型資料庫(RDBMS)
4.1.1 實質
-
這種型別的資料庫是
最古老
的資料庫型別,關係型資料庫模型是把複雜的資料結構歸結為簡單的二元關係
(即二維表格形式)。 -
關係型資料庫以
行(row)
和列(column)
的形式儲存資料,以便於使用者理解。這一系列的行和列被稱為表(table)
,一組表組成了一個庫(database)。 -
表與表之間的資料記錄有關係(relationship)。現實世界中的各種實體以及實體之間的各種聯絡均用
關係模型
來表示。關係型資料庫,就是建立在關係模型
基礎上的資料庫。 -
SQL 就是關係型資料庫的查詢語言。
4.1.2 優勢
-
複雜查詢
可以用SQL語句方便的在一個表以及多個表之間做非常複雜的資料查詢。 -
事務支援
使得對於安全效能很高的資料訪問要求得以實現。
4.2 非關係型資料庫(非RDBMS)
4.2.1 介紹
非關係型資料庫,可看成傳統關係型資料庫的功能閹割版本
,基於鍵值對儲存資料,不需要經過SQL層的解析,效能非常高
。同時,通過減少不常用的功能,進一步提高效能。
目前基本上大部分主流的非關係型資料庫都是免費的。
4.2.2 有哪些非關係型資料庫
相比於 SQL,NoSQL 泛指非關係型資料庫,包括了榜單上的鍵值型資料庫、文件型資料庫、搜尋引擎和列儲存等,除此以外還包括圖形資料庫。也只有用 NoSQL 一詞才能將這些技術囊括進來。
鍵值型資料庫
鍵值型資料庫通過 Key-Value 鍵值的方式來儲存資料,其中 Key 和 Value 可以是簡單的物件,也可以是複雜的物件。Key 作為唯一的識別符號,優點是查詢速度快,在這方面明顯優於關係型資料庫,缺點是無法像關係型資料庫一樣使用條件過濾(比如 WHERE)
,如果你不知道去哪裡找資料,就要遍歷所有的鍵,這就會消耗大量的計算。
鍵值型資料庫典型的使用場景是作為記憶體快取
。Redis
是最流行的鍵值型資料庫。
文件型資料庫
此類資料庫可存放並獲取文件,可以是XML、JSON等格式。在資料庫中文件作為處理資訊的基本單位,一個文件就相當於一條記錄。文件資料庫所存放的文件,就相當於鍵值資料庫所存放的“值”。MongoDB 是最流行的文件型資料庫。此外,還有CouchDB等。
搜尋引擎資料庫
雖然關係型資料庫採用了索引提升檢索效率,但是針對全文索引效率卻較低。搜尋引擎資料庫是應用在搜尋引擎領域的資料儲存形式,由於搜尋引擎會爬取大量的資料,並以特定的格式進行儲存,這樣在檢索的時候才能保證效能最優。核心原理是“倒排索引”。
典型產品:Solr、Elasticsearch、Splunk 等。
列式資料庫
列式資料庫是相對於行式儲存的資料庫,Oracle、MySQL、SQL Server 等資料庫都是採用的行式儲存(Row-based),而列式資料庫是將資料按照列儲存到資料庫中,這樣做的好處是可以大量降低系統的 I/O,適合於分散式檔案系統,不足在於功能相對有限。典型產品:HBase等。
圖形資料庫
圖形資料庫,利用了圖這種資料結構儲存了實體(物件)之間的關係。圖形資料庫最典型的例子就是社交網路中人與人的關係,資料模型主要是以節點和邊(關係)來實現,特點在於能高效地解決複雜的關係問題。
圖形資料庫顧名思義,就是一種儲存圖形關係的資料庫。它利用了圖這種資料結構儲存了實體(物件)之間的關係。關係型資料用於儲存明確關係的資料,但對於複雜關係的資料儲存卻有些力不從心。如社交網路中人物之間的關係,如果用關係型資料庫則非常複雜,用圖形資料庫將非常簡單。典型產品:Neo4J、InfoGrid等。
4.2.3 NoSQL的演變
由於 SQL 一直稱霸 DBMS,因此許多人在思考是否有一種資料庫技術能遠離 SQL,於是 NoSQL 誕生了,但是隨著發展卻發現越來越離不開 SQL。到目前為止 NoSQL 陣營中的 DBMS 都會有實現類似 SQL 的功能。下面是“NoSQL”這個名詞在不同時期的詮釋,從這些釋義的變化中可以看出 NoSQL 功能的演變
:
1970:NoSQL = We have no SQL
1980:NoSQL = Know SQL
2000:NoSQL = No SQL!
2005:NoSQL = Not only SQL
2013:NoSQL = No, SQL!
NoSQL 對 SQL 做出了很好的補充,比如實際開發中,有很多業務需求,其實並不需要完整的關係型資料庫功能,非關係型資料庫的功能就足夠使用了。這種情況下,使用效能更高
、成本更低
的非關係型資料庫當然是更明智的選擇。比如:日誌收集、排行榜、定時器等。
4.3 小結
NoSQL 的分類很多,即便如此,在 DBMS 排名中,還是 SQL 陣營的比重更大,影響力前 5 的 DBMS 中有 4 個是關係型資料庫,而排名前 20 的 DBMS 中也有 12 個是關係型資料庫。所以說,掌握 SQL 是非常有必要的。整套課程將圍繞 SQL 展開。
5. 關係型資料庫設計規則
-
關係型資料庫的典型資料結構就是
資料表
,這些資料表的組成都是結構化的(Structured)。 -
將資料放到表中,表再放到庫中。
-
一個數據庫中可以有多個表,每個表都有一個名字,用來標識自己。表名具有唯一性。
-
表具有一些特性,這些特性定義了資料在表中如何儲存,類似Java和Python中 “類”的設計。
5.1 表、記錄、欄位
-
E-R(entity-relationship,實體-聯絡)模型中有三個主要概念是:
實體集
、屬性
、聯絡集
。 -
一個實體集(class)對應於資料庫中的一個表(table),一個實體(instance)則對應於資料庫表中的一行(row),也稱為一條記錄(record)。一個屬性(attribute)對應於資料庫表中的一列(column),也稱為一個欄位(field)。
ORM思想 (Object Relational Mapping)體現:
資料庫中的一個表 <---> Java或Python中的一個類
表中的一條資料 <---> 類中的一個物件(或實體)
表中的一個列 <----> 類中的一個欄位、屬性(field)
5.2 表的關聯關係
-
表與表之間的資料記錄有關係(relationship)。現實世界中的各種實體以及實體之間的各種聯絡均用關係模型來表示。
-
四種:一對一關聯、一對多關聯、多對多關聯、自我引用
5.2.1 一對一關聯(one-to-one)
- 在實際的開發中應用不多,因為一對一可以建立成一張表。
- 舉例:設計
學生表
:學號、姓名、手機號碼、班級、系別、身份證號碼、家庭住址、籍貫、緊急聯絡人、...-
拆為兩個表:兩個表的記錄是一一對應關係。
-
基礎資訊表
(常用資訊):學號、姓名、手機號碼、班級、系別 -
檔案資訊表
(不常用資訊):學號、身份證號碼、家庭住址、籍貫、緊急聯絡人、...
-
- 兩種建表原則:
- 外來鍵唯一:主表的主鍵和從表的外來鍵(唯一),形成主外來鍵關係,外來鍵唯一。
- 外來鍵是主鍵:主表的主鍵和從表的主鍵,形成主外來鍵關係。
5.2.2 一對多關係(one-to-many)
- 常見例項場景:
客戶表和訂單表
,分類表和商品表
,部門表和員工表
。 - 舉例:
-
員工表:編號、姓名、...、所屬部門
-
部門表:編號、名稱、簡介
-
- 一對多建表原則:在從表(多方)建立一個欄位,欄位作為外來鍵指向主表(一方)的主鍵
5.2.3 多對多(many-to-many)
要表示多對多關係,必須建立第三個表,該表通常稱為聯接表
,它將多對多關係劃分為兩個一對多關係。將這兩個表的主鍵都插入到第三個表中。
-
舉例1:學生-課程
-
學生資訊表
:一行代表一個學生的資訊(學號、姓名、手機號碼、班級、系別...) -
課程資訊表
:一行代表一個課程的資訊(課程編號、授課老師、簡介...) -
選課資訊表
:一個學生可以選多門課,一門課可以被多個學生選擇學號 課程編號 1 1001 2 1001 1 1002
-
-
舉例2:產品-訂單
“訂單”表和“產品”表有一種多對多的關係,這種關係是通過與“訂單明細”表建立兩個一對多關係來定義的。一個訂單可以有多個產品,每個產品可以出現在多個訂單中。
-
產品表
:“產品”表中的每條記錄表示一個產品。 -
訂單表
:“訂單”表中的每條記錄表示一個訂單。 -
訂單明細表
:每個產品可以與“訂單”表中的多條記錄對應,即出現在多個訂單中。一個訂單可以與“產品”表中的多條記錄對應,即包含多個產品。
-
- 舉例3:使用者-角色
- 多對多關係建表原則:需要建立第三張表,中間表中至少兩個欄位,這兩個欄位分別作為外來鍵指向各自一方的主鍵。