目錄
一、使用版本号
二、使用生效、失效时间
三、使用单独的历史表
首頁 資料庫 mysql教程 数据库模型设计——历史与版本设计

数据库模型设计——历史与版本设计

Jun 07, 2016 pm 03:24 PM
amp 企業 歷史 數位 資料庫 模型 版本 設計

在企业数据库设计中,经常会遇到一个需求,就是希望把操作之前的数据保留下来,能够看到操作之前是什么数据,操作之后是什么数据。对于这种需求,我们可以使用保留历史数据或者使用版本来实现。 为了能够保留历史数据,在版本设计时有以下方案: 一、使用版

在企业数据库设计中,经常会遇到一个需求,就是希望把操作之前的数据保留下来,能够看到操作之前是什么数据,操作之后是什么数据。对于这种需求,我们可以使用保留历史数据或者使用版本来实现。

为了能够保留历史数据,在版本设计时有以下方案:

 

一、使用版本号

版本号是一种常见的版本设计方案,就是在要进行历史数据保留的表上面增加一个版本号字段,该字段可以是DateTime类型,也可以是int类型,每进行数据操作时,都是创建一个新的版本,版本是只增不减的,所以只需要拿到最大一个版本号,就能得到最新的业务数据。

版本号除了能够用于留存历史数据外,还有一个功能就是避免并发编辑操作。比如我们有一个对象A,当前的版本是1,两个用户同时打开了该对象的编辑页面,进行数据更改。先是甲用户提交更改,这个时候系统把对象的ID和版本进行查询,发现要修改的数据最新版本是1,所以成功修改,保存了对象A的新版本2。这个时候用户乙也提交了修改。系统把对象的ID和版本1进行查询,发现要修改的数据最新版本是2,不符合要求,所以拒绝用户乙的修改。用户乙只有刷新界面,拿到最新的版本2,再进行修改。

ID 单号 金额 版本号
1 EXP123 100 1

在使用版本号的情况下,对单据的金额进行修改,修改后创建新的版本号2:

ID 单号 金额 版本号
1 EXP123 100 1
2 EXP123 120 2

二、使用生效、失效时间

保存历史数据的第二办法是使用生效失效时间来表示一个版本。要进行历史数据记录的表增加“生效时间”“失效时间”两个字段,两个字段不允许为空。对于刚创建的数据,生效时间是创建该数据的时间,失效时间是9999-12-31。现在对这条数据进行了修改,那么我们只需要将当前时间设置为上一个版本的失效时间,同时创建一条新数据,生效时间是当前时间,失效时间是9999-12-31即可。

ID 单号 金额 生效时间 失效时间
1 EXP123 100 2013/9/1 15:30:00 9999/12/31 23:59:59

比如上面一条单据,是2013-9-1创建的,后来在2013-9-9 15:00:00对该单据进行修改,将金额从100修改为120,保存时创建的新数据如下:

ID 单号 金额 生效时间 失效时间
1 EXP123 100 2013/9/1 15:30:00 2013/9/9 15:00:00
2 EXP123 120 2013/9/9 15:00:00 9999/12/31 23:59:59

使用了生效、失效时间后,我们可以查询任意时刻数据库中数据的值,只需要把要查询的时刻传入,然后between 生效时间 and 失效时间即可。

使用前两种方案都需要一个业务主键来标识具体的一个业务数据。如果我们要记录的实体没有明确的“单号”、“订单号”这类的业务主键该怎么办?我们可以使用创建数据时的数据库主键作为业务主键。

员工ID 姓名 生日 业务ID 版本号
1 张三 1984/12/29 1 1

比如我们有个员工表,记录员工基本信息,在创建张三这个员工的数据时,其在数据库的ID为1,那么可以将其业务ID也设置为1。接下来对张三的属性进行更改,记录了版本,那么就会创建新的版本,其主键“员工ID”会变化,但是其业务主键“业务ID”始终是1,不会变化的。

员工ID 姓名 生日 业务ID 版本号
1 张三 1984/12/29 1 1
2 张三 1985/1/9 1 2

使用前面两个方案虽然能够很好的记录历史数据,但是每次修改数据都会导致新版本生成保存,所以每个版本的ID都是新的,所以必须有一个业务主键来标识一个实体,这里的两个例子“单号”就是其业务主键。主键的变动使得所有关联的对象都得变动,从而形成连锁效应,使得各个关联的对象也生成新的版本。比如我们有个订单系统,里面有订单表和订单明细表。现在我们要对订单的修改记录历史版本,所以增加了生效时间和实效时间,并使用订单号作为业务主键。现在有一个订单A,下面有100条明细,如果要对订单进行修改,将某一条明细的属性进行修改,从而导致整个订单的变化,那么我们就需要创建新的订单数据行,由于主键变动,所以订单明细都需要变动,所以100条明细都需要创建新的版本,新版本的订单明细中,“订单ID”指向了新的版本的订单数据的ID。

数据库模型设计——历史与版本设计

这样的设计造成的问题就是订单明细表会极速膨胀,如果一个订单有1000条明细,我们只是修改了订单本身的属性,并不修改订单明细,也会造成对这1000条明细做Copy,然后保存。那怎么办呢?我们可以使用以下办法:

1.对订单明细建立版本字段,将版本的粒度细化到订单明细,而不是订单。订单与订单明细不存在数据库级的外键关系,只存在业务级的外键关系。也就是说订单明细表中增加生效时间、失效时间之外,还需要增加“订单号”这个字段,用于表名该明细是属于哪个订单的。

数据库模型设计——历史与版本设计

我们这么修改后,如果订单对象进行了修改,订单明细没有修改(比如改了一下收件人信息),那么只需要在订单表中生成新的一行数据,订单明细不会Copy生成新的数据。如果我们对某一条订单明细进行了更改(比调整了单价、数量)那么只需要对具体修改的那条订单明细进行更改,而不需要对整个订单的所有明细进行更改。

使用这种设计后,查询订单及其明细,需要对两个表执行生效失效时间的过滤,而且明细的获取是通过订单号去取,而不是通过订单ID去取。

将版本控制的粒度细化到订单明细时,后台程序的逻辑也会更加复杂。用户在界面上操作的是订单对象,系统会将整个修改后的订单对象传到后台,后台程序需要对每个订单项进行对比,如果发现订单项进行了修改,那么就会调用生成新版本订单明细的方法。

2.使用单独的历史表

这是另外一种实现历史版本记录的方法:

三、使用单独的历史表

使用历史表其实就是建立完全相同Schema的表(当然,也可以添加更多的字段用于记录额外的历史版本信息),该表只保留历史版本的数据。这有点像一个归档逻辑,所有历史版本我们认为都应该是不经常访问的,所有可以扔到单独的表,对于现有生效的版本,仍然保留在原表中,如果需要查询历史版本,那么就从历史表中查询。

使用单独的历史表有以下好处:

  • 业务数据表的数据量不会因为历史版本记录而膨胀。因为历史数据都记录到了另外一个表中,所以业务数据表只记录了一份数据。
  • 业务数据表的Schema不需要调整,增加额外的版本字段。由于对原有数据表不做Schema变更,所以原有查询逻辑也不用更改。对于一个现有的数据库设计,在增加历史数据记录功能时更简单。
  • 业务数据表可以直接进行update操作,不会生成新的ID。由于ID不会变,所以我们并需要业务主键应用到程序逻辑中。

使用历史表记录历史版本主要是要对数据操作方法(增加、删除、修改)进行修改,使得每次数据操作时,先在历史表中留痕,然后再进行数据操作。另外就是对查询历史版本功能进行修改,因为历史数据在另外一个表中,所以对于的SQL是不一样的。当然,我们也可以创建历史版本数据库,里面保存了所有的历史表。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1246
24
榮耀Magic V3首發AI離焦護眼技術:有效緩和近視發展 榮耀Magic V3首發AI離焦護眼技術:有效緩和近視發展 Jul 18, 2024 am 09:27 AM

7月12日消息,榮耀MagicV3系列今日正式發布,搭載全新榮耀視力舒緩綠洲護眼屏,在屏幕本身俱備高規格和高素質的同時,還開創性的引入AI主動式護眼技術。據悉,傳統的緩解近視的方式是“近視鏡”,近視眼鏡度數均勻分佈,保證了視線中心區域成像在視網膜之上,但周邊區域成像在視網膜後,視網膜感應到成像在後,促進眼軸向後生長,從而使度數加深。目前主要的緩解近視發展的方式之一是“離焦鏡”,其中心區域度數正常,週邊區域透過光學設計分區調整,從而使周邊區域成像落在視網膜前,

1399元起 榮耀X60i手機開售:視覺四等邊OLED直屏 1399元起 榮耀X60i手機開售:視覺四等邊OLED直屏 Jul 29, 2024 pm 08:25 PM

7月29日消息,榮耀X60i手機今日正式開售,先發1,399元。設計上,榮耀X60i手機採用居中挖孔直屏設計,四邊近乎無界的超窄邊框,大大拓寬了視野邊界。榮耀X60i參數顯示器:6.7吋高清顯示器電池:5000mAh大容量電池處理器:天璣6080處理器(台積電6nm,2x2.4G的A76+6×2G的A55)系統:MagicOS8.0系統其他功能: 5G訊號增強靈動膠囊螢幕下指紋雙MIC降噪知識問答攝影能力:後置雙攝系統:5000萬像素主攝200萬像素輔助鏡頭前置自拍鏡頭:800萬像素價格:8GB

全新堆疊工藝!小米MIX Fold 4首搭金沙江「立體異型」電池 全新堆疊工藝!小米MIX Fold 4首搭金沙江「立體異型」電池 Jul 20, 2024 am 03:20 AM

7月19日消息,小米MIXFold4首旗艦折疊新機今晚正式發布,首次搭載「立體異形電池」。據介紹,小米MIXFold4在電池技術上實現了重大突破,專為折疊螢幕設計了創新的「立體異形電池」。傳統折疊式螢幕設備多採用常規方形電池,空間利用效率較低。為解決此問題,小米沒有採用常見的捲繞式電芯,而是全新開發疊片製程,打造全新形態的電池,大幅提升了空間利用率。電池技術創新為了實現精確交替堆疊正負極片,確保鋰離子安全嵌入,小米開發了新型超音波焊接機和疊片機,提高了焊接和裁切精

蘋果 Vision Pro 迎來重大更新,visionOS 1.3 RC 版本發布 蘋果 Vision Pro 迎來重大更新,visionOS 1.3 RC 版本發布 Jul 25, 2024 pm 04:25 PM

7月24日消息,蘋果近日向VisionPro頭顯用戶推送了備受期待的visionOS1.3RC版本更新,這項更新標誌著蘋果在虛擬實境領域的持續創新與進步。儘管官方並未明確透露此次更新的具體內容,但用戶普遍預期將包括效能優化、功能改進以及錯誤修復。本次更新的內部版本號為21O771,距離上次更新已過141天。不過,由於蘋果各區域節點伺服器配置快取問題,部分使用者可能會遇到升級更新的延遲現象。蘋果建議用戶在安裝更新前進行資料備份,確保資訊安全。 1.VisionPro用戶可透過裝置上的"

小米百元機 Redmi 14C 設計規格曝光 將於 8 月 31 日發布 小米百元機 Redmi 14C 設計規格曝光 將於 8 月 31 日發布 Aug 23, 2024 pm 09:31 PM

小米的Redmi品牌正準備在其產品組合中增加另一款經濟型手機——Redmi14C。該設備已確認將於8月31日在越南發布。然而,在發布之前,這款手機的規格已經透過越南零售商被披露。 Redmi14CRedmi經常在新系列中帶來全新的設計,Redmi14C也不例外。這款手機背面有一個大的圓形相機模組,與前代的設計完全不同。藍色配色版甚至採用漸層設計,讓它看起來感覺更高端。不過,其實Redmi14C是一款經濟型手機。相機模組包括四個環;一個環內裝有5000萬像素主傳感器,另一個可能裝有用於深度信息

榮耀Magic V3成功挑戰滾筒洗衣機15分鐘快洗:折疊唯一通過2.5公尺防水認證 榮耀Magic V3成功挑戰滾筒洗衣機15分鐘快洗:折疊唯一通過2.5公尺防水認證 Jul 18, 2024 pm 01:58 PM

7月12日消息,榮耀MagicV3今日正式發布,將折疊螢幕手機厚度帶入9.2毫米。特別值得一提的是,榮耀MagicV3在追求極致輕薄的同時,更透過前沿科技的運用,實現了業界領先的防水性能。得益於其採用的10微米級精密填充技術,這款手機不僅達到了IPX8等級的防水標準,即便在濕潤環境下也能保持觸控靈敏,為用戶帶來無憂的使用體驗。發表會現場,榮耀更是以一場大膽的實驗,直接將MagicV3置於滾筒洗衣機中進行15分鐘快洗測試,結果令人驚嘆——手機不僅安然無恙,更彰顯了其卓越的防水實力。榮耀

三星 Galaxy Z Flip6 評測:簡約設計與實用體驗,小折的版本答案來了? ! 三星 Galaxy Z Flip6 評測:簡約設計與實用體驗,小折的版本答案來了? ! Jul 30, 2024 pm 12:54 PM

在折疊螢幕領域,小折疊螢幕憑藉著輕盈便攜、精緻小巧的時尚屬性,同樣備受許多年輕用戶的喜愛。在之前的三星GalaxyZFold6大折疊螢幕評測中,我給了它「更方更AI」的評價。而與它同一時間發表的小折疊螢幕——三星GalaxyZFlip6,同樣備受矚目。那麼它又會有怎樣的體驗呢?今天,我們就一起來解鎖這款時尚新品。 「輕」設計:流於指尖的時尚顏值和GalaxyZFold6一樣,GalaxyZFlip6機身採用了方正形態的設計。展開型態下,機身比一般的直板機還要修長,前後以直邊中框銜接,四個R角保留了圓潤的形態

全球最小5G手機正式發表:5.05吋小螢幕 附1億主攝 全球最小5G手機正式發表:5.05吋小螢幕 附1億主攝 Jul 19, 2024 pm 09:10 PM

7月19日消息,根據媒體報道,國外廠商UnihertzJellyMax推出了一款全球最小的5G手機,售價199美元。據悉,JellyMax在保持極致便攜性的同時,搭載了5.05英寸的HD+LCD顯示屏,採用挖孔設計,屏幕分辨率720x1520像素。值得注意的是,其重量約180克,相較於iPhone13mini的輕盈(140克)。硬體配置聯發科天璣7300高效能處理器12GBLPDDR5x高速記憶體256GBUFS3.1海量儲存Android14作業系統拍照系統100MP主相機8MP長焦鏡頭32

See all articles