一次保留訂單歷史記錄的方案討論
一、背景
有夥伴提了一個問題。
描述如下:
假設一條記錄包含以下資訊:(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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- EBS:銷售訂單歷史記錄
- git-清空歷史提交記錄(保留原倉庫)Git
- Dynamics CRM 在表單上顯示更改歷史記錄(稽核歷史記錄)
- 歷史對話整理:古代戰爭討論
- TcxMRUEdit 最近歷史記錄
- win10怎樣看歷史記錄_win10檢視歷史記錄的方法Win10
- 紀錄一次 sentry 升級歷史
- linux 清空歷史執行記錄Linux
- 如何禁止input輸入的歷史記錄?
- 記一次訂單號事故
- 記錄一次WhatTheFuck經歷
- Linux檢視歷史記錄小技巧Linux
- git log檢視提交歷史記錄Git
- 查詢SQL Server的歷史執行記錄SQLServer
- 清除 GitHub 歷史記錄的隱私資訊Github
- 清除“遠端桌面連線”的歷史記錄
- win10怎麼清除更新歷史記錄 win10電腦如何清除更新歷史記錄Win10
- 記錄一次Mongodb被勒索的經歷MongoDB
- 記錄一次AndroidStudio導OkHttp的經歷AndroidHTTP
- 記錄一次破解xjar加密的經歷JAR加密
- 透過歷史記錄執行本地模型模型
- ClipboardManager for Mac(剪貼簿歷史記錄管理)Mac
- Git 學習記錄之演變歷史Git
- 修改Kali Linux終端歷史記錄大小Linux
- win10如何關閉工作列歷史記錄_win10工作列歷史記錄怎麼關閉Win10
- 與 Taro 團隊核心開發兼運營的一次 CSS 佈局討論的記錄CSS
- 記一次訂單號重複的異常
- win10如何關閉活動歷史記錄_win10系統關閉活動歷史記錄的步驟Win10
- SAP MM ME1P查詢採購訂購訂單價格歷史
- Git新手教程-檢視倉庫的歷史記錄(四)Git
- SqlServer查詢資料改動歷史記錄SQLServer
- 使用 JavaScript 操作瀏覽器歷史記錄 APIJavaScript瀏覽器API
- 2018.03.05 Android 記一次關於Fragment生命週期的討論。AndroidFragment
- 查詢當天的系統訂單記錄
- Mac上的Safari瀏覽器如何檢視歷史記錄?Mac瀏覽器
- 如何刪除遠端桌面歷史連線記錄
- Linux中多種方法實時記錄歷史命令Linux
- 7 個實用的操作 Bash 歷史記錄的快捷方式