編輯-發佈-開發分離:git做爲NoSQL數據庫

動態網頁是下一個要解決的難題。咱們從數據庫中讀取數據,再用動態去渲染出一個靜態頁面,而且緩存服務器來緩存這個頁面。既然咱們均可以用Varnish、Squid這樣的軟件來緩存頁面——代表它們能夠是靜態的,爲何不考慮直接使用靜態網頁呢?javascript

爲了實現以前說到的編輯-發佈-開發分離的CMS,我仍是花了兩天的時間打造了一個面向普通用戶的編輯器。效果截圖以下所示:java

Echeveria Editor

做爲一個普通用戶,這是一個很簡單的軟件。除了Electron + Node.js + React做了一個140M左右的軟件,儘管打包完只有40M左右 ,可是仍是會把用戶嚇跑的。不過做爲一個快速構建的原型已經很不錯了——構建速度很快、而且運行良好。git

儘管這個界面看上去仍是稍微複雜了一下,還在試着想辦法將連接名和日期去掉——問題是爲何會有這兩個東西?redis

從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的形式存儲文件呢?json

咱們都定義了這每篇文章的基本元素:緩存

  1. title服務器

  2. author機器學習

  3. date編輯器

  4. description

  5. content

  6. 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你會獲得下面的結果:

Man Git

這個答案看起來頗有意思——不過這看上去彷佛無關主題。

不一樣的數據庫會以不一樣的形式存儲到文件中去。blob是git中最爲基本的存儲單位,咱們的每一個content都是一個blob。redis能夠以rdb文件的形式存儲到文件系統中。完成一個CMS,咱們並不須要那麼多的查詢功能。

這些上千年的組織機構,只想讓人們知道他們想要說的東西。

咱們使用NoSQL是由於:

  1. 不使用關係模型

  2. 在集羣中運行良好

  3. 開源

  4. 無模式

  5. 數據交換格式

我想其中只有兩點對於我來講是比較重要的集羣數據格式。可是集羣和數據格式都不是咱們要考慮的問題。。。

咱們也不存在數據格式的問題、開源的問題,什麼問題都沒有。。除了,咱們以前說到的查詢——可是這是能夠解決的問題,咱們甚至能夠返回不一樣的歷史版本的。在這一點上git作得很好,他不會像WordPress那樣存儲多個版本。

git + JSON文件

JSON文件 + Nginx就能夠變成這樣一個合理的API,甚至是運行方式。咱們能夠對其進行增、刪、改、查,儘管就當前來講查須要一個額外的軟件來執行,可是爲了實現一個用得比較少的功能,而去花費大把的時間可能就是在浪費。

git的「API」提供了豐富的增、刪、改功能——你須要commit就能夠了。咱們所要作的就是:

  1. git commit

  2. git push

相關文章
相關標籤/搜索