在CMU 又發(fā)現(xiàn)一套很好的資源
https://15445.courses.cs.cmu.edu/fall2018/schedule.html
這個(gè)文集,就決定讀薄這門課。希望對(duì)自學(xué)這門課的人有一定幫助吧。
前置課程 CSAPP(見(jiàn)我的CSAPP的文集)
編程語(yǔ)言C++ 11,簡(jiǎn)易教程 https://www.thegeekstuff.com/2016/02/c-plus-plus-11/
教材,https://www.db-book.com/db7/index.html
進(jìn)入正題
什么是數(shù)據(jù)庫(kù)
我們經(jīng)常會(huì)發(fā)現(xiàn),整個(gè)世界是具備一定的聯(lián)系的。比如我買了一部IPHONE手機(jī),你也買了一部。我在A班讀書(shū),你在B班讀書(shū)。A班里有我,XXX,等40個(gè)同學(xué)。這些都是一個(gè)個(gè)的關(guān)系。
在計(jì)算機(jī)系統(tǒng)中,我是一個(gè)數(shù)據(jù),班級(jí)是一個(gè)數(shù)據(jù),為了把數(shù)據(jù)的內(nèi)在聯(lián)系進(jìn)行建模就產(chǎn)生了關(guān)系型數(shù)據(jù)庫(kù)的概念。
數(shù)據(jù)庫(kù)也是很多電腦程序的最核心的組件。
舉個(gè)簡(jiǎn)單的例子
我們現(xiàn)在有一組音樂(lè)家的信息,還有那些音樂(lè)家發(fā)布專輯的信息。 在沒(méi)有數(shù)據(jù)庫(kù)的時(shí)代,我們?cè)撊绾伪4娌樵冞@些信息呢?
一個(gè)經(jīng)典的做法是存進(jìn)CSV中。(這里要求你知道啥是CSV,不知道百度一下)
就會(huì)是如下這樣

我們?cè)撊绾握业?code>Ice Cube 出道的年份呢?
我們可以用如下代碼來(lái)做

這種做法是不足夠好的,所以人們開(kāi)始思考?
在數(shù)據(jù)完整性上
- 我們?cè)撊绾未_保這個(gè)音樂(lè)家對(duì)每個(gè)專輯 都是同樣的那個(gè)音樂(lè)家呢?
- 如果有人在出道日期上寫(xiě)了個(gè)‘哈哈哈’,怎么辦呢
- 我們要如何存儲(chǔ)多個(gè)音樂(lè)家合作發(fā)布的專輯呢?
在實(shí)現(xiàn)上
- 如何找到一個(gè)特定的條目
- 有一個(gè)新的APP 想用同一個(gè)DB,怎么辦
- 2個(gè)線程同時(shí)寫(xiě)同一個(gè)文件怎么辦?
在持久化上
- 如果在我們的程序更新記錄時(shí)機(jī)器崩潰怎么辦?
- 如果我們想在多臺(tái)機(jī)器上復(fù)制數(shù)據(jù)庫(kù)以獲得高可用性,該怎么辦?
這就引出了我們數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)
DBMS是允許應(yīng)用程序存儲(chǔ)和分析數(shù)據(jù)庫(kù)中的信息的軟件。
通用DBMS旨在允許數(shù)據(jù)庫(kù)的定義,創(chuàng)建,查詢,更新和管理。
下面引出2個(gè)新的詞匯
data model:數(shù)據(jù)模型是用于描述數(shù)據(jù)庫(kù)中的數(shù)據(jù)的概念的集合。
schema: 模式是使用給定數(shù)據(jù)模型對(duì)特定數(shù)據(jù)集合的描述。
DB 分類

最下面2個(gè)是棄用的
關(guān)系模型的三要素
structure結(jié)構(gòu):關(guān)系的定義及其結(jié)構(gòu)內(nèi)容。
integrity完整性:確保數(shù)據(jù)庫(kù)的內(nèi)容滿足限制。
manipulation操縱:如何訪問(wèn)和修改數(shù)據(jù)庫(kù)的內(nèi)容。
一個(gè)關(guān)系 其實(shí)就是數(shù)據(jù)的一個(gè)列。是一個(gè)實(shí)體的一個(gè)屬性。

在這個(gè)基礎(chǔ)上,就會(huì)有一個(gè)或者一組屬性可以唯一確定一個(gè)實(shí)例,我們稱它為主鍵(primary key),在不指定主鍵,有些DB會(huì)增加一個(gè)隱式的主鍵。

外鍵指定來(lái)自一個(gè)關(guān)系的屬性必須映射到另一個(gè)關(guān)系中的元組。

數(shù)據(jù)操縱語(yǔ)言(Data Manipulation Language, DML)是SQL語(yǔ)言中,負(fù)責(zé)對(duì)數(shù)據(jù)庫(kù)對(duì)象運(yùn)行數(shù)據(jù)訪問(wèn)工作的指令集
關(guān)系代數(shù)
σ Select

π Projection

∪ Union

∩ Intersection

-Difference

× Product

? Join

其他關(guān)系代數(shù)

關(guān)系代數(shù)仍然定義了如何計(jì)算查詢的HIGH-LEVEL的步驟。更好的方法是只指定自己要查詢的內(nèi)容,而忽略查詢的細(xì)節(jié),這就是SQL
如下 2種關(guān)系代數(shù)查詢的內(nèi)容是一致的
→ σ{b_id=102}(R?S) vs. (R?(σ{b_id=102}(S))
SQL 就是 同樣的。
結(jié)語(yǔ)
數(shù)據(jù)庫(kù)無(wú)處不在。
關(guān)系代數(shù)定義了在關(guān)系數(shù)據(jù)庫(kù)上處理查詢的原語(yǔ)。
當(dāng)我們討論查詢優(yōu)化+執(zhí)行時(shí),我們將再次看到關(guān)系代數(shù)。