Git 作為 NoSQL 數據庫
來自: http://my.oschina.net/phodal/blog/625309?fromerr=wmObPUs6
動態網頁是下一個要解決的難題。我們從數據庫中讀取數據,再用動態去渲染出一個靜態頁面,并且緩存服務器來緩存這個頁面。既然我們都可以用Varnish、Squid這樣的軟件來緩存頁面——表明它們可以是靜態的,為什么不考慮直接使用靜態網頁呢?
為了實現之前說到的 編輯-發布-開發分離 的CMS,我還是花了兩天的時間打造了一個面向普通用戶的編輯器。效果截圖如下所示:
作為一個普通用戶,這是一個很簡單的軟件。除了Electron + Node.js + React作了一個140M左右的軟件,盡管打包完只有40M左右 ,但是還是會把用戶嚇跑的。不過作為一個快速構建的原型已經很不錯了——構建速度很快、并且運行良好。
盡管這個界面看上去還是稍微復雜了一下,還在試著想辦法將鏈接名和日期去掉——問題是為什么會有這兩個東西?
從Schema到數據庫
我們在我們數據庫中定義好了Schema——對一個數據庫的結構描述。在《 編輯-發布-開發分離
》一文中我們說到了echeveria-content的一個數據文件如下所示:
{ "title": "白米粥", "author": "白米粥", "url": "baimizhou", "date": "2015-10-21", "description": "# Blog post \n > This is an example blog post \n Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ", "blogpost": "# Blog post \n > This is an example blog post \n Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \n Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." }
比起之前的直接生成靜態頁面這里的數據就是更有意思地一步了,我們從數據庫讀取數據就是為了生成一個JSON文件。何不直接以JSON的形式存儲文件呢?
我們都定義了這每篇文章的基本元素:
- title
- author
- date
- description
- content
- url
即使我們使用NoSQL我們也很難逃離這種模式。我們定義這些數據,為了在使用的時候更方便。存儲這些數據只是這個過程中的一部分,下部分就是取出這些數據并對他們進行過濾,取出我們需要的數據。
Web的骨架就是這么簡單,當然APP也是如此。難的地方在于存儲怎樣的數據,返回怎樣的數據。不同的網站存儲著不同的數據,如淘寶存儲的是商品的信息,Google存儲著各種網站的數據——人們需要不同的方式去存儲這些數據,為了更好地存儲衍生了更多的數據存儲方案——于是有了GFS、Haystack等等。運營型網站想盡辦法為最后一公里努力著,成長型的網站一直在想著怎樣更好的返回數據,從更好的用戶體驗到機器學習。而數據則是這個過程中不變的東西。
盡管,我已經想了很多辦法去盡可能減少元素——在最開始的版本里只有標題和內容。然而為了滿足我們在數據庫中定義的結構,不得不造出來這么多對于一般用戶不友好的字段。如鏈接名是為了存儲的文件名而存在的,即這個鏈接名在最后會變成文件名:
repo.write('master', 'contents/' + data.url + '.json', stringifyData, 'Robot: add article ' + data.title, options, function (err, data) { if(data.commit){ that.setState({message: "上傳成功" + JSON.stringify(data)}); that.refs.snackbar.show(); that.setState({ sending: 0 }); } });
然后,上面的數據就會變成一個對象存儲到“數據庫”中。
今天 ,仍然有很多人用Word、Excel來存儲數據。因為對于他們來說,這些軟件更為直接,他們簡單地操作一下就可以對數據進行排序、篩選。數據以怎樣的形式存儲并不重要,重要的是他們都以文件的形式存儲著。
git作為NoSQL數據庫
在控制臺中運行一下 man git 你會得到下面的結果:
這個答案看起來很有意思——不過這看上去似乎無關主題。
不同的數據庫會以不同的形式存儲到文件中去。blob是git中最為基本的存儲單位,我們的每個content都是一個blob。redis可以以rdb文件的形式存儲到文件系統中。完成一個CMS,我們并不需要那么多的查詢功能。
這些上千年的組織機構,只想讓人們知道他們想要說的東西。
我們使用NoSQL是因為:
- 不使用關系模型
- 在集群中運行良好
- 開源
- 無模式
- 數據交換格式
我想其中只有兩點對于我來說是比較重要的 集群 與 數據格式 。但是集群和數據格式都不是我們要考慮的問題。。。
我們也不存在數據格式的問題、開源的問題,什么問題都沒有。。除了,我們之前說到的查詢——但是這是可以解決的問題,我們甚至可以返回不同的歷史版本的。在這一點上git做得很好,他不會像WordPress那樣存儲多個版本。
git + JSON文件
JSON文件 + Nginx就可以變成這樣一個合理的API,甚至是運行方式。我們可以對其進行增、刪、改、查,盡管就當前來說查需要一個額外的軟件來執行,但是為了實現一個用得比較少的功能,而去花費大把的時間可能就是在浪費。
git的“API”提供了豐富的增、刪、改功能——你需要commit就可以了。我們所要做的就是:
- git commit
- git push