天天看點

記一次保留訂單曆史記錄的方案讨論一、背景二、 讨論出幾個方案三、方法比結果更重要,授人以魚不如授人以漁

一、背景

今天技術交流群裡,段段同學提了一個不錯的問題。

描述如下:

假設一條記錄包含以下資訊:(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 設計方案就是不斷地取舍的過程,空間換時間也是常見的性能優化思路,适當的資料備援有時候也很有必要。

最後歡迎大家探讨工作中遇到的難點,分享工作中遇到的坑,共同進步。

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

全面講解性能優化的文章:

https://blog.csdn.net/w605283073/article/details/107589987
創作不易,如果本文對你有幫助,歡迎關注、點贊、評論,你的鼓勵是我創作的最大動力。