(本次進度:location 907 ~ 1065)
上次提到多對一或多對多的資料關聯性對data model帶來的挑戰,接下來的段落更進一步深入了這個主題,揭露了我過去不知道的歷史:由IBM的Information management system為代表的hierarchical model,以及作者稱為「the great debate」,至今仍爭吵不休的relational model與network model之戰。
作者帶入這個論點的楔子十分巧妙,大概是說:「不管一開始的資料表述多麼地join-free,資料間的連結往往因為後續增加的新功能而變得愈來愈強」,然後舉了LinkedIn的例子。一開始大家的履歷上的「公司」欄可能都只是個字串,但當為了該公司增加專屬profile頁面後,這些字串都得換成entity reference,一個人又可以有好幾家公司的經歷,多對多的關聯性就出現了。
hierarchical model基本上就是把資料表述為tree,跟今日的document-based model非常相似,多對多或多對一的關聯性對它帶來了一樣的挑戰,因此促生了relational model與後來式微的network model:CODASYL system。總括而言,relational model能夠勝出的原因在於成功的抽象化:query language加上不斷改善的query optimizer使開發人員不需要花太多心力在資料關聯性,而network model則會需要開發人員實際動手操作類似graph API的東西,建立"access paths"來取用資料,維護不易。今日hierarchical model又以document-based model之姿華麗回歸,挾帶schema flexibility、更好的效能、與更貼近應用端資料表述等標語,吾等碼農又該如何選擇?
關於這點,作者用一個很好的子標題提問切入:
Which data model leads to simpler application code?
而答案一如既往地無趣又實際:看情況。一切都要看你的應用中資料怎麼長,而我們開發人員的職責從古至今沒有改變,只是去了解問題的本質,設計其資料表述,再選用適當的工具去處理,如此而已。這也是為什麼本書要花這麼多篇幅來回深入討論不同data model的「性質」,而不是說「優劣」。我也很喜歡本書對schema-on-read和schema-on-write的觀點:這就像動態型別和靜態型別一樣,基本上沒有對錯,而爭辯永遠會在。
下回待讀的段落標題是「data locality for queries」,會不會針對其效能方面的實質效果做更深入的檢討呢?令人期待。