好書一起讀(166):重學資料庫之存儲
讀《資料庫系統實現》來鞏固資料庫基礎。
資料庫三大要點:存儲,查詢,事務。這篇說存儲。
存儲的話題對應的是書的第2至5章,其中第2章講計算機如何存儲數據,345章講選用哪種數據結構最合適。第2章的內容與計算機組成原理中分層存儲的體系類似,不多說。345章分別講數據的結構、索引的結構、多維索引的結構,其中數據的結構和索引的結構是重點。
第3章講數據的結構。面向對象編程語言中類、對象、實例變數的概念,對應的是資料庫中的關係、元組、屬性的概念,它們也被稱為文件、記錄和欄位。欄位是最基本的單元,記錄由若干欄位組成,文件是記錄的集合。最簡單的存儲方式,就是每個文件保存一個關係,文件中每行表示一個元組,元組中屬性們用分隔符隔開。
第4章講索引的結構。索引的功能是「特徵進,記錄出」,以進行有效的查詢和修改。所以索引常被組織為便於查詢的數據結構,即樹或散列表。
數據是信息本身。但為了讓信息被有效地使用,信息還需要良好的形式,良好的形式包括了數據的存儲結構,也包括了索引的組織結構。作為信息的容器,資料庫不能僅僅滿足於讓信息不丟失,還應該能讓數據可以被方便地查詢和修改。畢竟,資料庫是用來對外提供服務的,客戶端調用其介面時的體驗是否良好,是評價資料庫好壞的重要標準。
計算機最核心的存儲硬體是內存和硬碟,內存小而貴,斷電後數據會丟失,硬碟大而便宜,斷電後數據仍然保存,所以大量數據的持久化存儲選用的硬體是硬碟。但是硬碟中的數據不能直接被使用,需要一個載入到內存的過程。
載入到內存的數據,其結構決定了使用起來是否方便。樹狀結構比順序結構查找起來快得多,這就是索引的價值。但因為數據是需要進行修改的,數據修改時就要進行更新索引的操作,這有個成本。所以與是否用緩存相類似,是否用索引考慮的也是數據被查詢和修改的頻率。如果數據經常被查詢,卻很少被修改,則使用索引能獲得很大收益,反之則不然。
存儲的具體細節,對我個人價值不大,短時間也學不清,就讓它留在書本上。如感興趣,可以去看書的相應章節。還是那句話,學東西的一大要點,就是判斷什麼東西暫時不學。這些細節,涉及到組成原理、操作系統、數據結構和演算法,後面查詢的章節還會涉及到編譯原理,所以說基礎知識是很有用的。
如果先不考慮事務,資料庫還剩餘持久和查詢這兩大要點,可以看成是寫和查。既然需要的演算法是寫和查,你會為之設計什麼樣的數據結構呢?數據結構和演算法的關係是,演算法是剛需,數據結構是副產品。對資料庫而言其「演算法」和「數據結構」的關係也是如此。
在生活和工作中,我們也常遇到保存信息、檢索信息的需求。即使沒有資料庫,我們也早已習慣了使用表格,不論是紙質的還是EXCEL電子版,我們本能地知道比使用WORD文檔中散文這樣的文體更好。因為表格有結構而散文沒有,表格是二維表,而散文是順序結構。表格中的信息讀起來一目了然,可以直接進入人類大腦,而散文中的信息則需要閱讀者自行完成在腦海中建構格式的工作,何況真實情況是有建構格式的意識和技術的人並不多。
如果是紙質的表格,當長達幾十頁,想從中尋找若干條特定的記錄,就是很麻煩的事了。電子版的表格,藉助計算機硬體和軟體的強大的計算能力,能快速地完成查詢的功能。但如果數據量更大,對查詢速度要求更嚴苛,就必須藉助更適合查詢的數據結構,比如樹狀結構的索引。從散文到紙質表格,再到EXCEL文檔,再到資料庫,讀和寫的效果越來越好,但是對使用者的技術水平要求越來越高。對現實世界中的信息進行抽象和結構化,需要對問題領域的深入理解,更需要人類理性思維能力,二者兼備,才能建立優秀的模型。
資料庫模型的建立中涉及範式的概念,越高的範式,在保持信息量不變的硬性前提下,邏輯性越好,佔用空間也越小,其形式往往與現實世界中使用的概念有著良好的對應。永遠不要低估在現實生活中凝結的人類智慧,對現實世界中的業務建立模型,最好的策略往往是反映現實,而不是自作聰明地進行設計,以致對現實造成扭曲,自作聰明的後果往往是建立的模型在短時間內似乎比反映現實的模型效果更好,但當業務稍一變化,就可能一敗塗地。
世界中真正在運轉的東西是「實」,人類對這些問題使用的語言中的概念是「名」,程序員對世界理解之後建立的模型是另一種「名」。前一種「名」,來源於無數人的無數次實踐,其概念模型經過無數次檢驗證明效果良好,後一種「名」,則來源於寥寥幾個甚至一個程序員在相當短時間內的學習研究。這一對比就很清楚,除非程序員自己天賦異稟、智商極高,否則動腦子想出的模型往往不會比現實生活中的語言概念更合理。腦力工作者,往往有濫用腦力的傾向,比如對自己根本不懂的政治自作聰明地發表議論。只有知道了藏愚守拙,才算是從聰明向智慧走出了一步,「不自見,故明;不自是,故彰」,「知不知,智也;不知知,病也」,把自己寫程序的時候用到的腦子,不論什麼時候都拿出來用用,也算是一種「拿著鎚子看什麼都像釘子」,這是傲慢、狂悖和妄為。希望每個需要在編程中對業務建模的人都懂得這個道理,在業務面前保持敬畏,常有謙虛和請教的心,體會和領悟其中的道理,不要因為自己是代碼的主人,就誤以為自己是世界的主人,否則遲早會自食其果。
推薦閱讀:
※存儲過程到底有什麼用?
※[跟吉姆一起讀LevelDB]3.Memory Barrier與leveldb::DB::Open操作(2)
※阿里雲Elasticsearch的X-Pack:機器學習、安全保障和可視化
※[MySQL]獵聘網數據分析職位數據清洗
※如何用R訪問MySQL資料庫
TAG:数据库 |