蘇建文的實習所學

我的學習

 我從實習中學到目前在網頁系統開發時常用的工具與架構,在開發環境的架設主要使用的是Docker與Rancher來完成快速的部署與建置。前端的方面,交接的Web Annotation使用的是MVC架構的Laravel,IIIF manifest editor使用的是React.js架構,而目前開發的影像辨識標記系統未使用到任何框架。後端方面,API使用Node.js配合Express框架進行開發,資料庫一開始使用MongoDB,後來考慮到需整合至中心其他網站的相容性問題,故以同樣支援JSON格式的MySQL 5.7作為替代。 目前整合完的第一個專案數位博物館使用的CMS是Drupal,以開發插件模組的方式完成。以下為學習心得的詳細內容:

  1. Docker
  2.  校外實習第一件所學到的就是使用rancher來快速佈署架設網頁所需要的環境,rancher是基於最近相當熱門的docker 所產生的GUI。以往在使用虛擬機架設網頁伺服器時都需要花上不少時間,因為會有需多設定需要自己動手設,且每個網頁伺服器在虛擬機上都是一套完整的os系統,像是windows server 或是ubuntu等等,有時候甚至會因為需要的功能較多而架設多台虛擬機造成資源上的浪費。

     然而docker解決了這些虛擬化上常遇到的麻煩,dokcer讓伺服器不只輕量化也易於快速部署及移植。Docker在容器的啟動 上比虛擬機快上許多是以秒作為單位的,而在資源的使用效率上也較虛擬機高上許多。Docker透過容器(container)來執行應用程式,每個container都是一個獨立的平台。而docker的image 就是讓container可以這麼快速啟動及省資源的最大功臣,使用者可以使用他人寫好的image來部署自己所需的程式,且image內只會包含該程式的必須資源,因此可以很省資源。



    ▲上圖為 虛擬機與docker的差異

     虛擬機是利用沙盒(sandbox)來建立一個可以獨立執行整套作業系統的環境。 而Container是從應用程式下手,將一個應用程式所需的相關程式碼、函式庫、環境配置檔都打包起來建立一個沙盒執行環境。虛擬機需要安裝作業系統(Guest OS)才能執行應用程式, 而Container內不需要安裝作業系統就能執行應用程式。Container技術不是在OS外來建立虛擬環境,而是在OS內的核心系統層來打造虛擬執行環境,透過共用Host OS的作法, 取代一個一個Guest OS的功用。因此在建置應用程式上,container的速度會快上許多。

  3. MySQL 5.7
  4.   在規劃 IIIF manifest editor 存註記以及manifest 所需的環境時,原本打算使用MongoDB但因為這個軟體主要是為了 外單位或是廠商而開發,但大多的單位主要是使用MySQL和Orcale的Database,因此開始研究如何存註記且能有利於將來開發搜尋註記的系統。在研究的過程中,發現了MySQL從5.7版後開始 支援JSON的datatype,且原生就提供了許多可以搭配傳統SQL的函示來協助處理JSON資料。

      傳統上,要儲存JSON大多會使用MongoDB,若要在MySQL上儲存JSON則會使用text的資料格式。但是使用text格式進行 儲存的JSON資料通常會遇到一些問題,像是取資料、修改資料等函式都需要自己手動寫,除了費時外還可能會遇到像能不佳導致搜尋及修改時間拉長許多。

      新版的MySQL提供了許多native function讓使用者可以更加方便來進行對於JSON的操作。利用SELECT配上這些JSON的 native function可以快速預覽資料進行SQL語法後 會產生怎樣的變化,卻不會實際的修改到資料本身。利用UPDATE配合JSON的native function可以更新JSON Datatype中特定的Object 或是Array,DELETE可以移除特定部分或是整筆資料。JSON_OBJECT( ), JSON_ARRAY( ), JSON_VALID( )可以協助將資料轉換成特定的類型還可以避免不符合JSON格式的資料存入資料庫導致 以後查詢跟修改的困難JSON_SEARCH( )與JSON_EXTRACT( )就像傳統的SQL SELECT可以協助取出需要的資料,JSON_SET( )以及JSON_ARRAY_APPEND( )則可以協助資料的更新, JSON_REMOVE( )則是協助將資料從JSON中移除。

      有了這麼多方便的function使得在MySQL的JSON datatype具有一定的優勢,因為它可以與傳統的關聯式 資料庫混合 使用,MySQL也在最近推出了8.0的正式版,可見其對於混和式資料庫的看中。當然在這個大數據的時代 效能也是非常重要的一環,因此MySQL對於JSON格式提供的Virtual index跟 Virtual column來協助搜尋的速度。

    下圖是比較20萬筆資料單純使用JSON function進行取資料和經過virtual index所花費的時間差。

  5. MongoDB
  6.   MongoDB屬於NoSQL類型的資料庫,所代表的意義是not only SQL,儲存的資料可以不用受到嚴格的schema限制,擁有更多的彈性也適合大量的資料儲存。 MongoDB是文件導向式(document-oriented)的資料庫,與傳統的關聯式導向資料庫相比,它不再有row的概念,取而代之的是document的概念。MongoDB儲存資料的格式就是JSON, 因此一開始開發manifest以及annotaion API時,就是使用MongoDB來進行儲存。但對於註記可能會需要頻繁修改的適應性較差,且其他單位或是廠商的資料庫系統多不是MongoDB, 因此最後選用MySQL。

      Document是MongoDB的核心,它就是Key對應Value的組合(就像普通object那樣)。一個Collection會包含多筆Document,如果與關聯式資料庫做比較, Collection就是整張Table所儲存的所有資料。但Collection是動態的他不像關聯式資料庫的Table會受到Schema的限制只能存特定的資料。操作MongoDB也與傳統資料庫的SQL相當不一樣, 要操作Collection的話就要使用與Collection有關的function像是insert( ),與程式語言的function運用相當類似,因此就算沒有SQL語法的基礎知識也能輕鬆上手。

      若談到管理資料庫的介面話,在MySQL非phoMyAdmin莫屬而在MongoDB的話,我覺得Robo 3T是一個不錯的選擇。Robo 3T的介面相當簡潔,可以協助管理者 簡單的管理資料以及修改,透過介面中的shell即可直接對MongoDB進行操作。甚至還提供將SQL語法直接轉化成MongoDB的語法,省去了可能要解決語法錯誤的時間。將JSON文件以淺顯易懂 的階層方式呈現,方便管理者尋找要的資料以及了解JSON的結構。



    ▲上圖為Robo 3T介面圖

Categories: Works, Learned Tags: #ascdc, #John Su

回前頁