天天看點

雲開發資料庫重構:如何将字段抽離成單獨的集合

把一個最初内嵌的字段提取出來,單獨建立一個集合來管理

關于作者

Eric KK

曾供職于雲盾、簡書,資深前端工程師,we-plugin開源項目組成員,現任潮辦科技CTO,基于騰訊雲開發轉型全棧開發者,獨立完成多個微信小程式從0到1全功能完整上線運作。

“使用雲開發之後,一個小程式可以快速的從無到有上線運作,這個速度是傳統開發不能比的,特别适合初創團隊快速上線産品搶占市場或試錯。而使用雲開發,我們通常要做的第一件事就是設計資料庫,雲開發的資料庫使用結構化的文檔來存儲資料,不再是關系型資料庫裡每個行列交彙處都必須有且隻有一個值,它可以是一個數組、一個對象,或者更加複雜的嵌套。

在初期産品需要快速出可用原型,上線時間緊迫的情況下,資料庫設計難免會有欠考慮的地方,等産品開始進入疊代期就可能會有重構需求。團隊最近對項目進行了重構,寫一篇文章分享我們在做重構的一些心得。“

目的

這次資料庫重構隻有一個目的,把一個最初内嵌的字段提取出來,單獨建立一個集合來管理。也就是把反範式化設計的資料庫結構轉成範式化的設計。

關于範式化和反範式化,你可以看雲開釋出道師東哥的文章:

https://club.cloudbase.net/handbook/tcb/1203.html

舊資料方案的痛點

在産品上線的第一個版本時,bagList字段是内嵌在一個user文檔裡的,如下:

這裡的資料是精簡版,真實情況還會有很多商品資訊、使用者資訊等,此處隻是舉例說明。

這樣的反範式化設計在最初上線的版本中并沒有什麼問題,因為商品價格較高,早期也認為使用者并不會大量購買。然而沒想到的是,在經過一波營運宣傳後,使用者量開始猛增,其中也出現了一些土豪使用者,他們的購買數量已經不是個位數了,有的都超過了100件以上,此時bagList字段的數組長度就變得非常大。

在這個時候,資料分頁、商品發貨、修改商品資訊就已經很難維護,一直使用了層層的聚合操作先查詢出來,然後再修改。猶豫不決之際,新的開發需求出現,要求可以讓使用者之前互換資料,原有的資料結構想要實作類似的功能存在較高的實作成本。是以,決定幹脆重構資料庫,提升開發效率。

重構步驟

将 bagList 字段單獨拿出來形成一個集合的好處有很多,資料分頁很友善,修改商品資訊很簡單,且很多雲資料庫的原子操作修改都可以直接使用,更重要的是新需求互換功能隻需要修改對應商品的所有者 userid 就可以完成。但此時内嵌結構已經使用了很久,資料也已經記錄了很多,如何把這些曆史資料無縫銜接的拿出來成了問題,這裡使用了一系列的聚合操作來完成。

這裡用的是雲開發管理控制台自帶的進階操作腳本,首先第一步開啟聚合模式,在聚合中單次limit最大數現為10000,因改版時使用者數正好低于10000,是以這裡直接拉到最大。然後使用match來删選user集合中bagList字段不為空數組的文檔。緊接着使用project標明在下一階段想要的展示的字段,_id字段預設存在,其餘字段直接舍棄。此時的執行結果如下圖:

接下來我們就需要用unwind來拆分bagList,拆分完的資料結構如下:

此時每一個商品已經單獨抽離出來,如果此時的結構已經達到了想要的要求,那就可以直接使用現有資料,如果還想自定義一下,那就可以繼續使用聚合操作來完成,如上面我因為還有其他需求,使用聚合再次改變了一些結構寫法,聚合的操作可以去雲開發文檔聚合學習。

不過,聚合出來的資料并不是嚴格的json資料,雖然現在的雲開發控制台的進階腳本可以批量添加資料,add方法中的data可以為數組,這在資料量小的情況下可以直接使用,但我們這次聚合出來幾千條資料,經測試,雲開發的進階腳本并不支援那麼大的資料量一次性導入,那麼我們可以使用資料庫的json格式導入。

建立一個新集合products,這裡使用vscode把我們聚合出來的資料複制粘貼到一個名為products.json的新檔案中(名稱随意),然後将最外層的[]包裹删除,全局搜尋 },換行{ 替換為 }換行{ ,把每條資料之間的逗号去除(注意:在搜尋的時候,換行也要,不然内嵌資料的逗号也會被替換),儲存并使用 json方式把資料導入到products集合就大功告成啦。

總結

在開發的過程中,難免會遇到需要重構資料庫的場景,我自己沒有搜尋到相關的文檔,便将自己的實踐經驗分享出來,做第一個吃螃蟹的人,供大家參考。

如果你對重構方面有任何問題和想法,歡迎留言和一起讨論。

公衆号:騰訊雲雲開發

騰訊雲雲開發:https://cloudbase.net

雲開發控制台:https://console.cloud.tencent.com/tcb?from=12304

更多精彩

掃描二維碼了解更多

繼續閱讀