後端中階之非關聯式資料庫(NoSQL):Learning Not (Only) MongoDB, but (also) prior knowledge of SQL

--

(註1:本文為ALPHA Camp舊版全端網路開發第三學期:後端開發實務課程心得的一部分,2019下半年筆者修習此課程後有所調整,和現今課程內容有所差異,目前與部分前端課程併入學期二)

(註2:由於本學期課程開始安排ORID 學習週記,便改成轉貼週記文字並稍作調整,至於其他心得感想,則集中到談整學期的文章)

(註3:Codenvy已於臺灣時間2019/12/9關閉服務,Eclipse Che服務為其替代方案,皆使用Linux作業系統,但介面與VSCode更接近而友好,且能在同一畫面預覽網頁;
然而,不支援開放
sudo(super user,相當於windows的系統管理員)權限,無法自行安裝新軟體,儘管可以選擇建立包含MongoDB的主機,但提供的版本寫入及查詢資料庫需要特別設定,操作方法與ALPHA Camp的教案不同,故目前不特別推薦Eclipse Che,僅適合未使用資料庫的後端專案練習,未來有空再另外介紹操作方式)

代序:近半年後的「溫新知故」

整理此篇文章時(2020.05-06),已距離學期三練習NoSQL的階段約半年,由於學期三後期與學期四的主軸是練習SQL,其實已把MongoDB的語法忘的差不多了(太久沒寫......);但回去看當時的程式碼,仍能從現在的開發經驗與代碼語意,大概回顧理解那時在寫什麼。

更直接地來說,學用一種資料庫後有助於「觸類旁通」,透過比較就能快速掌握另一種的操作語法,例如課程安排有要求將相同的專案,例如代辦清單(Todo-List)分別做出MongoDBMySQL的版本,二者連CRUD的寫法格式也很相似,改寫時替換許多語意相近的動詞與部分特有的設定即可

儘管如NoSQL(MongoDB)與SQL(如MySQL)用起來有點像,可以用相似的代碼與邏輯完成相同的任務,但實務上不同資料庫的運作特性有顯著的差異,以對應不同的資料庫需求,沒有絕對的優劣之別

簡單來說,非關聯式資料庫(NoSQL)如MongoDB的開發規則相較不嚴謹,最明顯如更動定義資料的model時沒有建立migration紀錄變遷與寫明關聯性的要求,執行速度理論上也因為不完全照關聯式資料庫(SQL)的特性運作(not only)而較快,但也因此較不精準(沒有依指令及時確實更新資料,當下不見得能呈現正確數據),卻得以快速處理大量資料與便於修改結構

相對之下,關聯式資料庫(SQL)儘管速度相對緩慢,但其結構強調單元性、一致性、隔離性和耐用性 (ACID)的嚴謹設計,特別是涉及重要資料與金錢交易,必須要能保障資料處理前後的安全與正確性。 如當前資料庫人氣排名前十名大都還是屬於SQL,就印證其在多數商用需求仍不可或缺的地位。

因此,一言以蔽之,這部分MongoDB的教學似乎是定位為後面的關聯式資料庫課程提供先備知識(prior knowledge,概念近似於先備能力)。 從課程後期回顧來說,學習的重點似乎不在於熟練這套工具,而是當成學SQL「踏板」,先藉架構較簡單的熟悉資料庫操作的感覺,有了經驗後再去學規則更多的,再多看文件、教學與論壇尋找對應的寫法(畢竟用哪套資料庫都還是常常需要查語法……)。

NoSQL的種類也是眾多,理論上也是學一種助於學其他種,取自:https://commons.wikimedia.org/wiki/File:Nosql.gif
To NoSQL or Not to NoSQL, That Is the Question

另外,由於非同步JS的內容放在NoSQL與SQL課程之間,且也是在學習資料庫操作時開始大量使用,因此一起在本文提及此選修部分。

學期中課程當週紀錄

1. Objective: 學做了什麼?完成了什麼?

第三週(基本CRUD操作):
依照教案的步驟,找出在Codenvy上操作MongoDB的方式,使用Mongoose將To-do List實作一遍,以及將作業一逐步改寫成使用資料庫的版本,並加上作業要求的新功能。
第四週(認證登入系統):
依照本週的進度流程,將範例與實作專案(待辦清單餐廳清單)加上完整的使用者認證系統,除了註冊、登入與登出,也包含session登入狀態、密碼雜湊(hash)整合Facebook登入等加強便利與安全的機制。
第五週(專案佈署上線):
學會如何將專案佈署到Heroku,並分別使用本機與線上IDE(codenvy)至少操作過一次,將之前完成的代辦清單餐廳清單,以及本週實作的記帳本推上雲端,成為獨立運作的網路應用程式。

第六週(非同步JS選修補充):
了解非同步(或翻譯為異步,asynchronous)的概念,以及如何以JS語言原本的Callback、改良的Promise與更新的Async/Await語法實作,並理解其演進緣由。

2. Reflective: 經歷學習,你的感覺如何? 為什麼? 如果有好的感覺,如何延續? 如果有不好的感覺,如何改善?

第三週(基本CRUD操作):
簡單來說就是「知易行難」,雖然上一期有在Windows完成一遍,但改到不同平台,以及作新的專案的時候,依循步驟實往往會不斷遇到非預期的狀況,儘管有提到作業期限延至昨日,且剛好上週末個人有事情,想到這週又有全新內容,仍覺得跟上週進度相當吃力,這週得多花時間才可能不再落後
第四週(認證登入系統):
與上週相比,這次有步驟的參考的部分沒什麼難度,照著做甚至接複製貼上使用者認證系統也能動,但要燒腦的則是作業的額外要求,以及來自助教與自己的優化建議。 卡在尚未解決的問題相當痛苦,會很想集中精力與時間多去網路查詢線索與實機嘗試,但避免像剛開始學程式時卡太久,會設定停損點,幾小時解不出來就去參考同學作業解法,至少對自己有個交代
第五週(專案佈署上線):
由於時程仍被上週的餐廳清單拖到,再加上自己很想將助教建議的路由修改完成實作,多卡了一段時間才移到新的進度。 儘管得再次延長時程仍對自己的效率感到不滿意,且幾乎都是自行想出寫法,還是覺得多花的時間沒有白費,有確實學到東西,不完全是壞事

第六週(非同步JS選修補充):
非同步其實是以前早就在其他地方用過(如學期二的Axios、這學期開始出現的各種伺服器Callback語法)但還沒正式介紹過的概念儘管經過這章節的說明確實能完整理解,但到轉用語法練習時還是覺得很難消化,都得看解答才能試圖去理解,感覺到未來實際需要用到時仍需多嘗試與尋找解答。

3. Interpretive: 開發當中,你個人或小組最大的學習體會是什麼? 有什麼問題還沒有被解決?

第三週(基本CRUD操作):
承上,既使有一定的程序可依循,只有有一點元素變動,如操作平台、檔案架構、原始碼內容等,往往因此產生許多新問題,易如拼寫錯誤,難如想不出寫法,都可能得用多於預期的時間去排除。 例如這次看似要求都有達到,但昨天工作坊又聽助教提到後端也需要資料檢核(指除了前端表單之外,後端controller與model也應該要對資料內容與類型作限制,以免寫入不合格式的資料),又多一個需要去解決的目標了。
第四週(認證登入系統):
本週最大體會,便是再次驗證解決問題的方法,可能和原先想的不同方向。 像我卡在如何種使用者ID時,原本想的是「如何修改語法,才能依我想的方式直接將資料或訊息插入」,參考幾份同學作業後,才發現原先的方向不一定正確:應該要先建立好帳戶再直接帶入ID到餐廳資料,而非把不合格式的物件ID寫出來強塞進去。 至於其他要求,則能順利自行找出方式加強,甚至還意外發現舊有漏洞並趕快修補
第五週(專案佈署上線):
為了縮短開發時間,我嘗試直接從相對簡單的代辦清單專案修改,原本以為能因不用重作CRUD架構與登入系統以準時挑戰到進階題,卻發現除了依線框稿刻前端頁面必然費時外,將後端變數全面替換後仍能運作也比預期麻煩,搞不好不見得比全部重頭寫快多少,過程中得一直靠錯誤訊息找出沒改到的部分。 然而,修改的過程也讓我得以重新檢視之前寫的程式碼架構,進而激發思考創新:做到進階題新增功能時,儘管起初沒有頭緒而一直陷在看不懂同學的寫法,卻在反覆思考如何簡單的答道題目要求時,意外想出自己的解法

第六週(非同步JS選修補充):
這週雖然內容看似很短,仍需要不少時間消化新的概念與語法,儘管最後仍得看解答才做出題目,但回頭看到本單元標為選修後,似乎先有基本概念即可,未來遇到時再想辦法完成實作。

4. Decisional:下一階段的學習打算做什麼?(解決什麼未完成的問題?改變學習方式?完成哪些挑戰等等

第三週(基本CRUD操作):
仍以完成當週進度為優先,印象中再來是身分驗證功能,由於這期有先試作過模擬登入,且不像上週有新的大工具,也許能多少縮減完課時間。
第四週(認證登入系統):
由於當週的進度仍延後數天開始,雖然看起來單元很少,但佈署網站又是一個新的概念,且聽說這次作業全程要花很多時間。 因此,這週得拿捏好花在新舊概念的部分:減少建立基本功能的時間,並延續學期初探索在Codenvy完成所有操作的方式,行有餘力再完善新作業的功能體驗。
第五週(專案佈署上線):
繼續新的進度。

第六週(非同步JS選修補充):
下一週是最後的章節:關聯式資料庫,感覺內容會愈前面的MongoDB有不少相似之處,希望這能更有效幫助學員將前面的概念與實作經驗轉移到新內容,且個人方面因之前稍有接觸過資料庫的觀念,也許能加深與過去經驗的連結,以更好掌握關聯式資料庫的內容。

5. 有什麼話想跟 AC(ALPHA Camp團隊的簡稱) 說?

第三週(基本CRUD操作):
覺得昨天(11/20)的工作坊有點無聊,若能像學期二有可以跟著助教或配時自行操作的部分較能有投入感。
第四週(認證登入系統):
近二週花的時間都比預期多,很擔心到最後的下學期花的時間會壓縮到其他事務而難以負擔。
第五週(專案佈署上線):
後來發現不只我,多數人連續幾週都無法準時完成作業,也許代表前面的課程進度分配可以再多調整,不然一直延後繳交時間蠻奇怪的?

第六週(非同步JS選修補充):
其實我在完成上單元大作業與本週前半時,剛好實際當週遇到天氣遽列變冷而身體不適,且這週一開始又遇到原先花很多時間自學的Codenvy平台服務被關閉,起初花時間研究能否轉用Eclipse Che完成本學期各作業需要功能,幾天後卻發現卡在資料庫與其他設定沒有sudo(root)可以用只能先放棄,等於消耗掉不少原先能直接投入課程進度的時間,也在這邊說明一下。

--

--

Bob Yu-Zhen Huang is developing on web

2020年代第一天起,以第一篇廢文開始網路開發的學習紀錄,短期目標是不定期分享關於寫程式,或與資訊、軟體、電腦勉強沾得上邊(?)的學習心得與感想(先定廣一點方便擴張範圍……);長期的話,則是將這個站停掉(!)──待未來自行架設部落格新站後搬過去(開發專案與習作彙整:https://github.com/BOBYZH)。