|
在一些場合,我們可能需要對業(yè)務(wù)實(shí)體進(jìn)行版本控制。類似于源碼管理工具一樣,可以查看歷史版本,可以回滾,可以Lock,一個業(yè)務(wù)實(shí)體對象,同一時刻只允許一個人進(jìn)行更新操作。為了實(shí)現(xiàn)信息的可追溯性,這些功能應(yīng)該是必不可少的。只是我們該在哪里去控制實(shí)體對象的版本呢?
我們希望將版本控制的功能,獨(dú)立于某一個具體的業(yè)務(wù)實(shí)體,這樣才可以實(shí)現(xiàn)最大共用和擴(kuò)展性。顯然,要實(shí)現(xiàn)這一功能最好的切入點(diǎn)應(yīng)該是在數(shù)據(jù)持久層,也就是在實(shí)體持久化時,我們需要有一個統(tǒng)一的,通用化的接口來完成,同時在這里插入版本控制的功能。無疑,這里的最合適的持久化接口應(yīng)該是ORM,那就相當(dāng)于我們要實(shí)現(xiàn)一個帶實(shí)現(xiàn)版本控制的ORM接口。
版本控制功能,我們不僅要求與數(shù)據(jù)庫無關(guān),還要求與具體的某一種ORM框架無關(guān)。與數(shù)據(jù)庫無關(guān),我們可以很容易通過ORM來隔立,但是與ORM框架無關(guān),我們就需要將版本控制的功能從與某一種ORM框架隔離開來。
版本控制功能,是插入到ORM接口中去的,那在哪里去檢測實(shí)體的修改情況呢?一種方案是將原始數(shù)據(jù)和修改后的數(shù)據(jù),傳入版本控制接口,由版本控制模塊進(jìn)行比較,從而得出實(shí)體的變化情況。
另一種方案,就是在實(shí)體中插入一定的屬性變化跟蹤機(jī)制,這也是現(xiàn)有的ORM實(shí)體中已經(jīng)有實(shí)現(xiàn)的一部分,不同的ORM框架在監(jiān)控實(shí)體更新變化方面都有不同的機(jī)制,在NBear,LINQ To SQL,Entity Framework都有一套自己的實(shí)體屬性變化跟蹤機(jī)制。我們可以將這些不同的跟蹤機(jī)制統(tǒng)一起來,形成一套標(biāo)準(zhǔn)的ORM版本控制模塊的接口實(shí)現(xiàn)。
還有一些需要考慮的:
存儲歷史版本時,是使用增量存儲還是使用完全存儲。增量存儲,在回滾歷史版本時,就需要從當(dāng)前版本起,做很多的回溯的工作,而完全存儲就可能會耗很多存儲空間。
在存儲方式上,我們是將它們存儲到數(shù)據(jù)庫,還是以XML文件的格式單獨(dú)存放每一個版本的記錄。
目前的一個存儲想法是:使用增量存儲與完全存儲共存,將每次改變的字段,以及它的原始值和新值保存到數(shù)據(jù)庫中,方便在查看歷史版本修改記錄時用。而將每個版本完整值,以一定的目錄格式,XML文件的格式保存在磁盤中,可以考慮壓縮等因素。這樣做的原因是,回滾歷史版本的操作一般是相對比較少的,但是存儲完整的歷史版本值,卻可能需要很多的數(shù)據(jù)庫空間和考慮備份的問題。假設(shè)我們以操作日期的目錄格式來保存文件,我們就可以方便的進(jìn)行備份和轉(zhuǎn)移。
遺留問題,在ORM中,對象的關(guān)聯(lián)是必不可少的內(nèi)容。對于對象之間的關(guān)聯(lián)關(guān)系發(fā)生變化是否也需進(jìn)行版本控制,這樣一來,版本控制的內(nèi)容就會變得更復(fù)雜和難以實(shí)現(xiàn)。所以暫且限定,版本控制只針對于單對象的屬性值變化。
以上就是ORM With versioning control的一些想法,這些想法是從Content Repository API For Java (JCR)衍生而來的。在JCR中是實(shí)現(xiàn)了一個自有格式(XML)的數(shù)據(jù)庫,用在CMS中存儲一些結(jié)構(gòu)可變(非結(jié)構(gòu)化)的內(nèi)容。同時在它的功能定義中,還包括了一些傳統(tǒng)數(shù)據(jù)庫(或數(shù)據(jù)庫使用接口)所不具有的功能,包括:版本控制,數(shù)據(jù)變化檢測等功能。我想法,在結(jié)構(gòu)化數(shù)據(jù)的存儲中,要實(shí)現(xiàn)這些功能,應(yīng)該是在ORM上來實(shí)現(xiàn),歡迎大家來討論。
NET技術(shù):ORM With Versioning Control,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。