選擇哪種擴展表?

2024年2月6日 27点热度 0人点赞

以前聊過Mysql以key-val存儲、正常存儲的區別,在此基礎上,我們再聊一下具體的業務場景。

如果一個業務,不斷的有新的字段增加,新增加的字段要參與到增刪改查功能中,底層需要怎麼設計?

我不建議把所有的數據全部打平為key-val結構,雖然擴展方便,但帶來的問題也很多。

場景判斷

其實需要先判斷一下真實的情況

  1. 字段增加的頻率
  • 如果幾個月增加一次,其實完全可以放主表,但是需要優化增刪改查的邏輯,實現隻需要很少的改動或者隻是配置就能實現增加字段的效果。這樣隻需要提DDL工單、配置一下(理想情況)就行。
  1. 增加的字段是強依賴還是弱依賴?這對擴展的要求是不一樣的。
  • 強依賴:如果使用擴展方案,最好使用事務。如訂單金額這種,必須和訂單強一致
  • 弱依賴:這種可以使用消息方案,如商品上的標簽、訂單上的備註等。這種可以使用打標系統,輔助消息補償

選型

一般而言我們都需要有一張主表(畢竟需求是慢慢變化的),根據不同場景需要使用不同的擴展方案。

主表方案

擴展表方案

思路一:在主表表添加字段

思路二:擴展字段添加key

思路三:純擴展表 - 事務

思路四:建打標系統 - 消息補償

優點

1. 清晰:字段明確,方便維護
2.獨立:不會影響其他配置
3.數據一致性:天生一致性

1.開發成本低:無需改庫、無需修改每個接口
2.擴展性強:可以方便的添加新的功能
3.數據一致性:天生一致性

1.擴展性強:能夠在不改動主表情況下增加字段
2.數據一致性:可以使用事務保證一致性
3.能力全:方便按照各種維度管理主表信息(版本、全局)

1.擴展性強:服務端改動小,開發成本低,新增字段僅需配置新的key。將部分屬性打平存儲到另一個庫表,不影響主表信息
2.能力全:方便按照各種維度管理主表信息(版本、全局)

缺點

1.擴展性差:可能需要在多個表表添加字段;需要修改增刪改查接口

1.不清晰:無法明確知道包含哪些功能
2.不獨立:擴展字段經存儲了很多配置,誤操作的更新操作可能影響擴展字段裡的其它配置

1. 維護成本高:事務保證強一致性;查詢復雜
2.字段浪費:必須有主鍵、更新時間等,而且字段必須是varchar
3.排序、篩選:實現復雜

1.無法保證強一致性:可能出現數據不一致問題(最終一致性)
2.維護成本高:tag表的版本維護,版本回退功能復雜
3.管理成本高:需要判斷使用該給功能的字段都無需強一致性
4.字段浪費:必須有主鍵、更新時間等,而且字段必須是varchar
5.排序、篩選:實現復雜

可以看到,一旦使用擴展方案,整個的維護復雜度是要提升很多的。

另外,如果真的是用擴展方案,因為裡面的value都是json,為了方便調用方,可以提供配套的SDK,改SDK可以分析擴展裡的數據,幫助調用方快速獲得信息,而不必理解json結構。

資料

  1. 這才是真正的表擴展方案
  2. 表擴展字段2種實施方案研究

最後

大傢如果喜歡我的文章,可以關註我的公眾號(程序員麻辣燙)

我的個人博客為:
https://shidawuhen.github.io/

往期文章回顧:

  1. 設計模式
  2. 招聘
  3. 思考
  4. 存儲
  5. 算法系列
  6. 讀書筆記
  7. 小工具
  8. 架構
  9. 網絡
  10. Go語言