變更日志101: 表與事件的二相性。
讓我們繼續(xù)聊數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)中存在著大量變更日志和表之間的二相性。這些日志有點(diǎn)類似借貸清單和銀行的流程,數(shù)據(jù)庫(kù)表就是當(dāng)前的盈余表。如果你有大量的變更日志,你就可以使用這些變更用以創(chuàng)建捕獲當(dāng)前狀態(tài)的表。這張表將記錄每個(gè)關(guān)鍵點(diǎn)(日志中一個(gè)特別的時(shí)間點(diǎn))的狀態(tài)信息。這就是為什么日志是非常基本的數(shù)據(jù)結(jié)構(gòu)的意義所在:日志可用來創(chuàng)建基本表,也可以用來創(chuàng)建各類衍生表。同時(shí)意味著可以存儲(chǔ)非關(guān)系型的對(duì)象。
這個(gè)流程也是可逆的:如果你正在對(duì)一張表進(jìn)行更新,你可以記錄這些變更,并把所有更新的日志發(fā)布到表的狀態(tài)信息中。這些變更日志就是你所需要的支持準(zhǔn)實(shí)時(shí)的克隆。基于此,你就可以清楚的理解表與事件的二相性: 表支持了靜態(tài)數(shù)據(jù)而日志捕獲變更。日志的魅力就在于它是變更的完整記錄,它不僅僅捕獲了表的最終版本的內(nèi)容,它還記錄了曾經(jīng)存在過的其它版本的信息。日志實(shí)質(zhì)上是表歷史狀態(tài)的一系列備份。
這可能會(huì)引起你對(duì)源代碼的版本管理。源代碼管理和數(shù)據(jù)庫(kù)之間有密切關(guān)系。版本管理解決了一個(gè)大家非常熟悉的問題,那就是什么是分布式數(shù)據(jù)系統(tǒng)需要解決的— 時(shí)時(shí)刻刻在變化著的分布式管理。版本管理系統(tǒng)通常以補(bǔ)丁的發(fā)布為基礎(chǔ),這實(shí)際上可能是一個(gè)日志。您可以直接對(duì)當(dāng)前 類似于表中的代碼做出“快照”互動(dòng)。你會(huì)注意到, 與其他分布式狀態(tài)化系統(tǒng)類似,版本控制系統(tǒng) 當(dāng)你更新時(shí)會(huì)復(fù)制日志,你希望的只是更新補(bǔ)丁并將它們應(yīng)用到你的當(dāng)前快照中。