成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊多版本業務模型設計

開發 前端
回滾其實很麻煩,包括已發布的回滾到上一個版本、發布中的回滾到草稿態。主要是前者很麻煩,尤其是有上下游使用了這個版本的數據,一般是不允許輕易回滾的。

 本文轉載自微信公眾號「編了個程」,作者Yasin x 。轉載本文請聯編了個程公眾號。

最近業務上用到比較多的多版本場景。這里總結一下多版本業務模型設計的思路。

多版本需求梳理

先梳理一下多版本的一般訴求:

  1. 同一個數據經過多次編輯后,會產生多個版本,其中歷史版本不能刪除掉,因為可能有上下游在使用;
  2. 多版本通常用于配置中,最新一個版本的配置通常可以多次修改、測試,確定后再發布;
  3. 已經發布的歷史版本不能隨便修改,因為有數據在使用;
  4. 在消費側,一般默認是使用最新已發布的版本;
  5. 多版本可能會有發布審批、與上一個版本的diff等需求場景;

多版本狀態機設計

一個多版本的業務模型,通常會有以下的狀態機。其中“廢棄”不是必須的,回滾操作也不是必須的(回滾操作會給代碼和表設計帶來很大的復雜性),發布中間可能會有發布中、審批中等狀態。

草稿可以在原版本編輯,但已發布的數據再編輯,就會生成一個新版本的草稿。

圖片

有時候也會有下線操作,這個時候所有版本的狀態就會被改為“已下線”。

多版本表設計

對于多版本而言,你需要有一個唯一標識這個業務數據的字段,可以叫id?或者code。

同時,需要一個字段來標識版本,這個版本建議是一個遞增的數字,叫version?。有些業務期望版本是業務輸入的,或者有一個版本說明的概念,那可以新增一個字段叫version_desc。

我們可以把唯一標識和版本拼接起來,作為這個數據在這個版本的唯一鍵,可以叫code_version?。通常是拼接成一個字符串,中間用某種特定的分隔符來區分,比如#?。那code_version?可能就長這樣:A12334#3?。這里就要求code?里面不能有分隔符#,不然代碼邏輯處理起來就比較麻煩。

這里說一下這個拼接字段的必要性,因為上下游往往會存code + version。那上下游在列表查詢等場景來查詢數據的時候,如果沒有這個字段,只能循環一個個查,不能用where批量查詢。

另外一個必要的字段就是status來標識當前版本的狀態。

還有一個非必須的字段is_last_version?,用來標識當前這條數據是不是它的最新版本,無論是草稿態還是已發布還是已廢棄,它都會變成true。這里在待會兒下文的查詢要點中會解釋它的用處。如果不用這個字段也能查,但是需要group by order,整體查詢語句麻煩,效率低。在寫的時候多維護一下這個數據,會讓查詢的時候方便很多。

其它的都是審計字段了。最終的建表語句可能長這樣:

CREATE TABLE `t_xxx`  
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`code` varchar(255) NOT NULL DEFAULT '' COMMENT 'code',
`version` int NOT NULL DEFAULT 0 COMMENT '版本',
`version_desc` varchar(255) NOT NULL DEFAULT '' COMMENT '版本說明',
`code_version` varchar(255) NOT NULL DEFAULT '' COMMENT 'code和版本',
`is_last_version` tinyint NOT NULL DEFAULT '0',
`status` varchar(255) NOT NULL DEFAULT '' COMMENT '狀態',
# 以下是業務字段...
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '名稱',

# 以下是審計字段...
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
`create_by` varchar(10) NOT NULL DEFAULT '' COMMENT '創建人',
`modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間',
`modify_by` varchar(10) NOT NULL DEFAULT '' COMMENT '修改人',
`deleted_at` bigint DEFAULT '0' COMMENT '刪除時間秒時間戳',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code_version_deleted_at` (`code`, `version`, `deleted_at`)
) ENGINE = InnoDB
AUTO_INCREMENT = 5
DEFAULT CHARSET = utf8mb4
COLLATE = utf8mb4_0900_ai_ci COMMENT ='xxx表'

生產端和消費端的查詢要點

生產端就是配置數據的地方,消費端就是使用的地方。生產端和消費端有一些區別,生產端往往要看最新的版本,包括草稿等狀態,還要能修改。而消費端一般只用最新已發布的版本。

生產端

生產端的查詢,可以按照is_last_version為true來過濾,這樣就只查每一個code的最新版本的數據。

同時,每個code也應該返回一個version?列表,是這個數據code_version的集合,以便用戶查看和跳轉歷史版本。

生產端的寫入,需要維護好狀態、版本、is_last_version等字段。在編輯的時候,要判斷當前的狀態是草稿態還是已發布,如果是已發布,是要創建一條新的記錄(當然這個在前端判斷也是可以的,但后端要做好校驗,防止頁面沒刷新等場景造成臟數據)。

消費端

消費端的查詢,需要查詢最新已發布版本,一般是通過狀態來過濾,比如status = Online。

但這里根據狀態過濾有一個問題:歷史已發布的版本怎么辦?如果一個code發布了3個版本,那豈不是會查出來3條數據?要解決這個辦法有兩種思路:

  • 狀態機添加一個Online_history的狀態,在寫入的時候維護這種狀態;
  • 表增加一個is_last_online_version,在寫入的時候維護這個字段;

我個人比較喜歡用第一種方案,少維護一個字段,僅僅多維護一個枚舉就行了。

其它注意事項

上下游

我們在上下游的接口交互中,除了要根據code?查最新已發布版本這種消費端場景外,通常用code_version來交互。這樣在DB中可以直接命中一條數據,查詢起來也方便。

這個數據和其他數據的關系,也通常使用code_version來存,因為不同版本關聯的數據可能不同。

diff

diff往往是利用領域模型json化后來diff。這里的diff能力可以做成一個通用的服務,傳入old json和new json,返回哪些是新增的,哪些是刪除的,哪些是變更的。內部的邏輯一般是利用json_path和遞歸的方法來做。

diff的難點是做成配置化,配置哪些屬性參與diff,哪些屬性ignore diff。diff出來之后,可能枚舉等需要key轉換成label,外部有一個轉換函數,或者前端去轉。

另一塊需要注意的就是數組的順序。有些字段雖然到json是數組,但業務上本身是順序無關的,這種數據的比對會更麻煩一些。

回滾

回滾其實很麻煩,包括已發布的回滾到上一個版本、發布中的回滾到草稿態。主要是前者很麻煩,尤其是有上下游使用了這個版本的數據,一般是不允許輕易回滾的。

如果有這類場景,多半是沒有上下游,比如服務發布、應用發布等。這種回滾,當前版本的數據一般也不會刪除,而是設置成一個特殊的狀態。下次編輯上一個版本的時候,生成的version也不是+1, 而是+2甚至是+n,還得查一遍庫,比較麻煩。

所以如果不是有特殊的需求,可以不做已發布的回滾,它會帶來很多復雜性。

責任編輯:武曉燕 來源: 編了個程
相關推薦

2023-02-10 08:59:42

業務技術核心

2023-11-27 07:57:46

2024-04-26 00:28:14

異地多活架構

2023-11-28 07:45:48

Rust自動化測試

2022-08-16 08:17:09

CDPCRM數據

2022-01-10 08:17:40

異地設計實踐

2012-12-03 13:50:40

IBMdW

2021-01-31 23:54:23

數倉模型

2021-10-09 07:55:49

設計師業務用戶需求

2020-04-01 10:48:28

業務設計架構模型CIO

2022-05-02 21:47:13

并發編程線程

2024-10-06 12:56:36

Golang策略設計模式

2023-11-06 08:26:11

Spring微服務架構

2024-04-17 08:03:45

架構設計Java

2022-02-08 08:12:51

無鎖編程設計

2024-08-18 14:09:24

2023-03-21 07:57:37

Go語言設計模式

2023-06-02 11:55:02

jvm多線程并發

2022-10-09 08:15:14

算法智能運維

2024-09-13 16:47:06

模型量化AI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美二区在线 | 国产女人与拘做受视频 | 求个av网址| 性做久久久久久免费观看欧美 | 久久综合一区二区 | 永久免费视频 | 色视频www在线播放国产人成 | 91人人爽 | 亚洲一区av| 久久久欧洲 | 刘亦菲国产毛片bd | 免费一区二区 | 丁香婷婷成人 | 岛国毛片在线观看 | 久久神马| 欧美一区二区三区在线观看视频 | 久久久www成人免费精品 | 久久久久无码国产精品一区 | 久久人体 | 日韩亚洲一区二区 | 欧洲成人午夜免费大片 | 国产精品激情 | 精品久久久久国产 | 精品一区久久 | 国产精品免费播放 | 午夜一区二区三区在线观看 | 免费视频成人国产精品网站 | 成人免费视频网站在线观看 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 国产精品一区二区三区免费观看 | 亚洲电影免费 | 午夜一级做a爰片久久毛片 精品综合 | 欧洲一区二区视频 | 精品av | 成人精品免费视频 | 午夜一区二区三区 | 欧美成人第一页 | 美女毛片 | 久久久久久久久91 | 国产精品欧美一区二区三区不卡 | 国产福利在线 |