posts - 297,  comments - 1618,  trackbacks - 0

          蜜果私塾:異構(gòu)數(shù)據(jù)庫數(shù)據(jù)校驗(yàn)方案探討

          文:阿蜜果

          日期:2011-8-5

          版權(quán)所有,轉(zhuǎn)載請注明出處

          最近在琢磨異構(gòu)數(shù)據(jù)庫數(shù)據(jù)校驗(yàn)的事情,想來想去覺得都不是易事,我想出了一個(gè)方案,但最終因?yàn)楣ぷ髁俊r(shí)間等原因,項(xiàng)目決定不再進(jìn)行數(shù)據(jù)校驗(yàn),在這里分享一下,拋磚引玉,希望得到同仁們的一些更好的方案。

          1、為什么要進(jìn)行數(shù)據(jù)校驗(yàn)?

          首先要回答這個(gè)問題:“為什么要進(jìn)行異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)校驗(yàn)?zāi)兀?#8221;本博的前兩篇文章探討了進(jìn)行異構(gòu)數(shù)據(jù)庫同步的方案,但是不論使用何種方式進(jìn)行同步,都可能因?yàn)楦鞣N原因?qū)е聝蛇厰?shù)據(jù)庫的不同步,例如一方的SQL語句執(zhí)行成功,而另一方轉(zhuǎn)換成新的SQL語句后執(zhí)行失敗,而沒有得到實(shí)時(shí)處理,或者同步程序存在bug等原因。

          進(jìn)行數(shù)據(jù)校驗(yàn)的原因是為了保證兩邊數(shù)據(jù)庫的數(shù)據(jù)一致性和完整性。

          數(shù)據(jù)不一致可能導(dǎo)致的結(jié)果:

          1)使得用戶進(jìn)行了某個(gè)設(shè)置,但未見生效;

          2)用戶已經(jīng)刪除了某設(shè)置,但仍然繼續(xù)生效;

          3)某個(gè)用戶在一方平臺已經(jīng)注銷或到期,而在另一平臺仍然可以使用等等。

          貼幾段關(guān)于數(shù)據(jù)一致性和數(shù)據(jù)完整性的代碼:

          數(shù)據(jù)一致性通常指關(guān)聯(lián)數(shù)據(jù)之間的邏輯關(guān)系是否正確和完整。而數(shù)據(jù)存儲的一致性模型則可以認(rèn)為是存儲系統(tǒng)和數(shù)據(jù)使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統(tǒng)所承諾的訪問結(jié)果。

          數(shù)據(jù)庫完整性(Database Integrity)是指數(shù)據(jù)庫中數(shù)據(jù)的正確性和相容性。數(shù)據(jù)庫完整性由各種各樣的完整性約束來保證,因此可以說數(shù)據(jù)庫完整性設(shè)計(jì)就是數(shù)據(jù)庫完整性約束的設(shè)計(jì)。數(shù)據(jù)完整性包括:實(shí)體完整性、域完整性、參照完整性和用戶定義完整性。可以使用主鍵、check約束外鍵等來實(shí)現(xiàn)。

          為了保證數(shù)據(jù)庫的一致性和完整性,設(shè)計(jì)人員往往會設(shè)計(jì)過多的表間關(guān)聯(lián),盡可能的降低數(shù)據(jù)的冗余。表間關(guān)聯(lián)是一種強(qiáng)制性措施,建立后,對父表和子表的插入、更新、刪除操作均要占用系統(tǒng)的開銷。

          如果數(shù)據(jù)冗余低,數(shù)據(jù)的完整性容易得到保證,但增加了表間連接查詢的操作,為了提高系統(tǒng)的響應(yīng)時(shí)間,合理的數(shù)據(jù)冗余也是必要的。使用規(guī)則和約束來防止系統(tǒng)操作人員誤輸入造成數(shù)據(jù)的錯(cuò)誤是設(shè)計(jì)人員的另一種常用手段,但是,不必要的規(guī)則和約束也會占用系統(tǒng)的不必要開銷,需要注意的是,約束對數(shù)據(jù)的有效性驗(yàn)證要比規(guī)則快。所有這些,設(shè)計(jì)人員在設(shè)計(jì)階段應(yīng)根據(jù)系統(tǒng)操作的類型、頻度加以均衡考慮。

          2、哪些是需要關(guān)心的表和字段?

          異構(gòu)數(shù)據(jù)庫的雙方需要確定哪些是需要進(jìn)行數(shù)據(jù)校驗(yàn)的表?需要關(guān)心的字段是哪些?哪一些字段不會影響到業(yè)務(wù)可以不去關(guān)心?畢竟進(jìn)行數(shù)據(jù)校驗(yàn)是一個(gè)耗時(shí)耗力的活。

          3、采用何種數(shù)據(jù)校驗(yàn)方案

          我感覺思維受限,暫時(shí)只想到這個(gè)個(gè)方案:

          1)關(guān)鍵表的總量比較。

          2)用戶信息的抽樣校驗(yàn):因?yàn)橹饕P(guān)心跟用戶有關(guān)的信息,因此對用戶信息進(jìn)行抽樣檢驗(yàn)。隨機(jī)抽取部分用戶(例如:10000個(gè)用戶)對其各項(xiàng)信息進(jìn)行比對,兩邊的數(shù)據(jù)按照一樣的XML Schema生成,可使用各種方式進(jìn)行比對(例如Shell進(jìn)行文件比對)。

          數(shù)據(jù)校驗(yàn)包括的程序大致如下:

          1)隨機(jī)抽樣程序

          隨機(jī)抽取若干(例如10000)號碼的程序

          2)數(shù)據(jù)校驗(yàn)定時(shí)程序

          同步用戶下的“數(shù)據(jù)校驗(yàn)定時(shí)程序”定時(shí)讀取(例如每天的晚上12點(diǎn))需要進(jìn)行數(shù)據(jù)校驗(yàn)的用戶信息,對每一行的用戶啟動(dòng)一個(gè)“數(shù)據(jù)校驗(yàn)處理程序”的自動(dòng)機(jī)進(jìn)行處理。

          3)數(shù)據(jù)校驗(yàn)處理程序

          每個(gè)“數(shù)據(jù)校驗(yàn)處理程序”自動(dòng)機(jī)只處理一個(gè)用戶信息,它通過查詢?nèi)舾杀淼玫皆撚脩舻脑敿?xì)信息,并根據(jù)定義好的XML格式寫入XML文件中。兩邊同步用戶采用一樣的XML Schema,按照一樣的排序生成XML文檔,XML Schema有待在校驗(yàn)數(shù)據(jù)確定后進(jìn)行定義。

          4)數(shù)據(jù)校驗(yàn)比對程序

          該程序?qū)Ρ葘Γɡ缤ㄟ^Linux命令進(jìn)行比對)兩個(gè)同步用戶下生成的XML文件,將不一致的用戶信息寫入錯(cuò)誤日志文件中。

          歡迎大家提出好的想法!開拓下我的思路。

          posted on 2011-08-05 17:43 阿蜜果 閱讀(2237) 評論(0)  編輯  收藏 所屬分類: database解決方案
          <2011年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關(guān)注blog

          積分與排名

          • 積分 - 2299173
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 师宗县| 黄梅县| 苍南县| 霍城县| 镇安县| 姜堰市| 南部县| 佛教| 木兰县| 西盟| 黄骅市| 涟水县| 柘城县| 临澧县| 邹城市| 曲麻莱县| 界首市| 营口市| 舞阳县| 周宁县| 太谷县| 丹东市| 长治市| 武乡县| 庆阳市| 花垣县| 太谷县| 东兰县| 海阳市| 城市| 汝城县| 阿城市| 揭阳市| 瑞金市| 普格县| 正蓝旗| 瑞昌市| 惠水县| 徐汇区| 安福县| 肥城市|