昨天,我把一篇占卜需要的資料和六個階段整理好了,也畫出了第一版的資料庫設計。照理來說,下一步就是把這些資料表真的建立進 PostgreSQL。
但今天開始做之後,我才發現中間其實還少了一件事:我要怎麼確定放進資料庫的,就是我原本設計好的那一份?
假設現在有兩份檔案,第一份負責建立昨天設計好的占卜資料表,第二份負責建立之後 Discord 發文會用到的資料表。最簡單的做法,就是把它們全部放進同一個資料夾,再按照順序執行。
問題是,如果第一份已經執行過,後來又被修改了呢?或者資料夾裡突然多出一份測試用的檔案,Macaron 要不要一起執行?
這些檔案是真的會修改資料庫,所以我不希望 Macaron 看到什麼就執行什麼。
因此今天先加了一張「允許執行的清單」,裡面會明確記錄有哪些正式檔案、執行順序,以及每一份檔案的內容指紋。只要檔案內容被改過,就算檔名完全一樣,指紋也會跟原本不同,Macaron 就會停止執行。
這樣至少可以確定一件事:真正進入資料庫的內容,必須是我原本確認過的版本。
另一個問題是,Macaron 要怎麼知道哪些檔案以前已經執行過?
所以資料庫裡也會有一張執行紀錄。假設第一份檔案已經成功執行過,而且現在的內容完全一樣,下一次就直接跳過;如果紀錄顯示它以前執行過,現在內容卻變了,就停止執行。
而且「修改資料庫」和「寫下執行紀錄」會被當成同一件事情。兩個都成功,這次修改才算完成。這樣就可以避免資料表建立到一半,紀錄卻沒有留下,最後連程式自己都搞不清楚做到哪裡。
如果之後真的發現第一版設計有問題,我也不會回頭修改舊檔案,而是新增下一份修正。例如第一版忘記「發布時間」,就另外新增一份「替占卜文章加入發布時間」的修改。這樣之後回頭看,才知道資料庫是怎麼一步一步變成現在的樣子。
今天另外新增的第二份設計,則先替後面的 Discord 發文準備了三張表。
「發文登記」會記錄 Macaron 準備發布哪一篇占卜、哪一個版本;「發文收據」會保存 Discord 回傳的結果;「待送清單」則負責記錄每一則訊息現在是等待、正在傳送、需要重試,還是已經完成。
其中有一種狀況我以前完全沒想過:Macaron 已經把訊息送出去,卻剛好沒有收到 Discord 的回應。這時候它其實不知道對方到底有沒有收到,如果直接再送一次,使用者可能就會看到兩篇一模一樣的內容。
所以這些狀態,我決定從資料庫設計階段就先留下位置,而不是等真的遇到問題再補。
全部準備好之後,我原本打算在自己的電腦上實際跑一次,結果發現目前沒有一個可以安全拿來測試的 PostgreSQL 資料庫。
所以今天我停在這裡。
目前可以確認的是:Macaron 已經知道哪些檔案可以執行、執行過哪些版本,以及中途失敗時該怎麼處理;但昨天設計好的那些資料表,目前還沒有真的建立進 PostgreSQL。
這也是 Day 04 我學到的事情:寫好資料表只是第一步。真正要執行之前,我還得確定它放進去的是正確版本,而且未來回頭看的時候,知道資料庫為什麼會長成現在這個樣子。
明天則要開始處理另一個我很在意的問題:Macaron 到底可以記得多少關於使用者的事情?
第一版的答案是,它刻意什麼都不記得。
馬卡龍預拌粉持續攪拌中……🍪