第二章 數(shù)據(jù)模型與查詢語(yǔ)言
The limits of my language mean the limits of my world.
—Ludwig Wittgenstein, Tractatus Logico-Philosophicus (1922)
關(guān)系模型和文檔模型
關(guān)系模型最著名的是SQL,我們?cè)趹?yīng)用的時(shí)候都需要在應(yīng)用代碼和數(shù)據(jù)庫(kù)模型之間插入一個(gè)笨拙的轉(zhuǎn)換層,這個(gè)時(shí)候以JSON文檔為代表的文檔模型就派上了用場(chǎng),我們可以將類似簡(jiǎn)歷那樣子的文檔存放在數(shù)據(jù)庫(kù)的文本列中。
關(guān)系的表示:以SQL為代表的關(guān)系模型所做的是定義了所有數(shù)據(jù)的格式:關(guān)系(表)只是元組(行)的集合。文檔數(shù)據(jù)庫(kù)則是某種類型的層次模型:即在其父記錄中保存了嵌套記錄。
文檔模型對(duì)聯(lián)結(jié)的支持不足,使用的時(shí)候需要按照應(yīng)用程序來(lái)決定是否適用。
對(duì)于高度關(guān)聯(lián)的數(shù)據(jù),文檔模型不太適合,關(guān)系模型可以勝任。
文檔數(shù)據(jù)是讀模式,數(shù)據(jù)的結(jié)構(gòu)是隱形的,只有在讀取時(shí)才解釋。類似動(dòng)態(tài)語(yǔ)言中的動(dòng)態(tài)類型檢查。
關(guān)系數(shù)據(jù)是寫模式,模式是顯式的,并且數(shù)據(jù)庫(kù)確保數(shù)據(jù)寫入時(shí)都遵從。類似靜態(tài)類型檢查。
文檔數(shù)據(jù)庫(kù)有查詢的數(shù)據(jù)局部性優(yōu)勢(shì),適合需要同時(shí)訪問(wèn)文檔大部分內(nèi)容的場(chǎng)景。
數(shù)據(jù)查詢語(yǔ)言
SQL是一種聲明式查詢語(yǔ)言,MS和CODASYL是命令式的。
- 命令式語(yǔ)言告訴計(jì)算機(jī)以特定順序執(zhí)行某些操作。
- 聲明式語(yǔ)言則只需指定所需的數(shù)據(jù)模式,結(jié)果需滿足什么條件,以及如何轉(zhuǎn)換數(shù)據(jù),而不需指明如何實(shí)現(xiàn)這一目標(biāo)。
聲明式查詢語(yǔ)言比命令式API簡(jiǎn)潔和容易使用,對(duì)外隱藏了數(shù)據(jù)庫(kù)引擎的很多細(xì)節(jié)實(shí)現(xiàn),能夠讓數(shù)據(jù)庫(kù)系統(tǒng)在不改變查詢語(yǔ)句的情況下提高性能。聲明式適合于并行執(zhí)行,命令式由于指定了特定的執(zhí)行順序,所以很難在多核計(jì)算機(jī)上做并行化。
MapReduce查詢既不是聲明式查詢,也不是一個(gè)完全命令式的查詢API,它查詢的邏輯用代碼片段表示,這些片段被處理框架重復(fù)調(diào)用,主要基于許多函數(shù)式編程語(yǔ)言中的map和reduce函數(shù)。
圖數(shù)據(jù)查詢
圖數(shù)據(jù)庫(kù)處理對(duì)于文檔模型和數(shù)據(jù)模型都難以處理的存在許多多對(duì)多關(guān)系的數(shù)據(jù)。
圖由頂點(diǎn)(結(jié)點(diǎn)、實(shí)體)和邊(關(guān)系、?。┙M成。SQL也可以使用WITH RECURSIVE實(shí)現(xiàn)圖數(shù)據(jù)庫(kù)的遞歸查詢,但是非常復(fù)雜。
三元存儲(chǔ)中,所有信息都以非常簡(jiǎn)單的三部分形式存儲(chǔ)(主體,謂語(yǔ),客體),例如(吉姆,喜歡,香蕉)。
三元組的主體相當(dāng)于圖的頂點(diǎn),而客體有以下兩種情況:
- 原始數(shù)據(jù)類型中的值,這時(shí)候三元組的謂語(yǔ)和客體分別相當(dāng)于主體(頂點(diǎn))屬性中的鍵值對(duì),例如(lucy, age, 33)。
- 圖中的另一個(gè)頂點(diǎn),這時(shí)候謂語(yǔ)是邊,主體是尾部頂點(diǎn),客體是頭部頂點(diǎn),例如(lucy, marriedTo, alain)。