一次保留訂單歷史記錄的方案討論

千鋒Python唐小強發表於2020-07-09

一、背景

有夥伴提了一個問題。

描述如下:

假設一條記錄包含以下資訊:(id,username,score,version),score每次變更,version就加1,對於username相同的資料,只有version最大的那一條是有效的,也就是Mysql按欄位分組取最大值記錄問題,怎麼做才能使查詢效率高呢

存在的問題

加 version 之後查詢最新的用子查詢效率不高;

建個額外的表記錄id 和 version 然後聯查,這種做法怪怪的,顯然效率也不夠高。

二、 討論出幾個方案

2.1 加標記

方案1:加上標記欄位,標記是否為最新記錄,這樣單獨查歷史還是查詢所有最新記錄都可以。

不符合單一職責原則,一個表表達兩種含義,一個是訂單記錄,一個是訂單歷史。

2.2 方案2:加歷史表

方案2:新增訂單歷史表,記錄帶版本號的記錄,另外還是維護一張主表用於查詢最新的記錄。

這樣兩種含義的記錄分開維護,邏輯更清晰。

一次保留訂單歷史記錄的方案討論

資料有一定的冗餘,但是思路清晰。

2.3 方案3 用 HBase

方案3:訂單表存到 HBase裡,預設查出最新的一條,可以根據版本號查詢所有,而且資料量大也沒壓力(不需要去做分庫分表)。

問題是引入了新的中介軟體。

最終根據建議,段段同學採用第二種方案。

三、方法比結果更重要,授人以魚不如授人以漁

我們知道了上面的方案還不夠,透過這個討論,我們學到了什麼,對我們以後有啥幫助?

下面總結幾點:

1 事出詭異必有妖,即如果發現一個方案很複雜,很奇怪,估計設計出了問題。

2 將未知問題轉化為已知問題是常見解決問題的方法。可以將該問題轉化為“標記刪除”問題,就簡單多了。

3 僅僅設計出實現功能的方案還不夠,要考慮是否便於維護,便於擴充,方便測試等。

4 設計方案就是不斷地取捨的過程,空間換時間也是常見的效能最佳化思路,適當的資料冗餘有時候也很有必要。

如果大家有更好的方案和建議,歡迎留言討論。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2703559/,如需轉載,請註明出處,否則將追究法律責任。

相關文章