我們聊聊CMU 15445之1 Relational Model
什么是數(shù)據(jù)庫?
數(shù)據(jù)庫是近幾年來最火熱的基礎(chǔ)軟件領(lǐng)域了,無論是開發(fā)者,創(chuàng)業(yè)者,投資者,愛好者,投身于數(shù)據(jù)庫及相關(guān)領(lǐng)域的人越來越多。
數(shù)據(jù)庫無處不在,應用在各個行業(yè)領(lǐng)域和方向,并且承擔了十分重要的作用,在如今這個數(shù)據(jù)爆炸的時代,各種各樣的數(shù)據(jù)量呈指數(shù)級上漲,數(shù)據(jù)的安全性、可靠性、存儲性能等都有了更高的要求,這也造就了數(shù)據(jù)庫以及相關(guān)領(lǐng)域的繁榮。
什么是數(shù)據(jù)庫?數(shù)據(jù)庫(database)可以簡單的認為是一個數(shù)據(jù)集合,這些數(shù)據(jù)互相關(guān)聯(lián),映射了真實世界的一些數(shù)據(jù)模型,例如一個班級(class)里的學生(student),學生會選課(student-lesson),老師會上課(teacher-lesson),學生會有考試成績(student-grade),它們相互關(guān)聯(lián)相互影響。
在數(shù)據(jù)庫的上層,有提供給用戶查詢數(shù)據(jù)的語言,最常見的即 SQL(Structured Query Language),這門課程主要專注于如何實現(xiàn)一個功能完備的數(shù)據(jù)庫系統(tǒng),而不是教我們?nèi)绾问褂靡粋€數(shù)據(jù)庫。
設(shè)計要點
讓我們先忘記 MySQL、PostgreSQL、Oracle 這些知名的數(shù)據(jù)庫系統(tǒng),來看看如果是我們自己設(shè)計一個數(shù)據(jù)庫系統(tǒng),應該怎么做,需要考慮和權(quán)衡哪些因素。
最直觀的想法,可以將數(shù)據(jù)存儲到一個 CSV 文件當中,文件中的每一行就是一條記錄,每個文件中存儲的是同一類數(shù)據(jù),例如我們有兩類數(shù)據(jù),歌手(artist) 和 唱片(album),artist 的數(shù)據(jù)有三個屬性,分別是歌手的名字、出生年、國家,album 的數(shù)據(jù)也有三個屬性,唱片名字、屬于哪個歌手、發(fā)行年份,數(shù)據(jù)存儲如下所示:

如果我們需要訪問這個數(shù)據(jù)庫,我們只能加載并解析這個文件,然后逐行尋找所需要的行。
這樣的實現(xiàn)存在什么問題呢?簡單總結(jié)大致如下:
數(shù)據(jù)控制訪問:
- 如果 album 的 year 字段數(shù)據(jù)被無效的字符串覆蓋了??如果一條 album 的數(shù)據(jù)需要對應多個 artist 數(shù)據(jù)??刪除一條 album 中的數(shù)據(jù)會怎么樣?
實現(xiàn)細節(jié):
- 怎么查找到一條記錄??如果有多個線程在同一時刻向文件中寫入數(shù)據(jù)?
持久性:
- 如果更新一條數(shù)據(jù)的時候機器崩潰了??怎樣把數(shù)據(jù)復制到多臺機器上以獲得高可用特性?
這些問題都是數(shù)據(jù)庫需要解決的,一個功能完備的數(shù)據(jù)庫系統(tǒng)需要屏蔽掉所有的細節(jié),讓用戶能夠安心存儲數(shù)據(jù)、查詢數(shù)據(jù),并且不擔心數(shù)據(jù)丟失等安全問題。
Relational Model
1970 年代,數(shù)據(jù)存儲并沒有統(tǒng)一的概念和實現(xiàn),每個應用都需要自己去實現(xiàn)一套數(shù)據(jù)存儲的方案,這非常不利于應用和程序的移植。于是 Ted Codd 在 1970 年提出了關(guān)系模型(relational model)的概念,主要有以下三個關(guān)鍵點:
- 數(shù)據(jù)存儲在簡單的數(shù)據(jù)結(jié)構(gòu)中
- 能夠通過高級語言訪問數(shù)據(jù)庫
- 物理存儲的細節(jié)交給數(shù)據(jù)庫管理系統(tǒng)實現(xiàn)
數(shù)據(jù)模型(data model)指的是描述數(shù)據(jù)庫中數(shù)據(jù)的概念集合,常見的數(shù)據(jù)模型有以下幾種:
- Relational
- Key/Value
- Graph
- Document
- Column-family
- Array / Matrix
- Hierarchical
- Network
其中 relational 是最常見、應用最廣泛的關(guān)系模型,大多數(shù)常見的數(shù)據(jù)庫系統(tǒng)例如 MySQL、PostgreSQL、Oracle 都是關(guān)系模型;K/V、Graph、Document、Column Family 屬于 NoSQL 類型,例如 rocksdb、neo4j、MongoDB、Redis;Array/Matrix 常用于機器學習領(lǐng)域,例如 TileDB;Hierarchical 和 Network 分別代表層次和網(wǎng)狀模型,是很古老的數(shù)據(jù)模型了,目前已經(jīng)過時。
relational model 主要有三個關(guān)鍵的點:
- structure:定義關(guān)系(relation)的結(jié)構(gòu)、屬性
- integrity:保證數(shù)據(jù)庫的數(shù)據(jù)符合預期的限制,例如一些字段的數(shù)據(jù)類型限制
- manipulation:怎樣去訪問和修改數(shù)據(jù)庫中的數(shù)據(jù)
其中 relation 可以認為是一張表,一個 tuple 是一個元組,表示一個表中的一條記錄。
一個 relation 通常有一個主鍵(primary key),標識一個唯一的 tuple,大多數(shù)的數(shù)據(jù)庫會自動創(chuàng)建一個內(nèi)置的主鍵,如果用戶沒有指定主鍵的話。relation 的外鍵(foreign key)通常標識一個 relation 映射到另一個 relation 的 tuple。
這節(jié)課主要講述了數(shù)據(jù)庫需要解決的問題,以及一些設(shè)計的要點,然后了解了常見的幾種數(shù)據(jù)模型,本課程主要專注于關(guān)系型數(shù)據(jù)模型,下節(jié)課將會了解下數(shù)據(jù)庫的操作語言—SQL 的基礎(chǔ)知識。

































