2012-03-22 66 views
2

我試圖開發一個系統,讓用戶在自己的筆記本電腦更新本地,離線數據庫,並在重新連接到網絡上,與主,主數據庫同步其DBS期間序列化的數據。優勢DB同步

我看着MySQL的複製,但文件側重於單向同步。所以我想我要在Python中構建一個自定義應用程序(雙向同步),並且我有幾個問題。

我讀過幾篇關於這個問題的文章,其中一個被動提及的是序列化(我將通過python中的pickle和cPickle模塊實現)。有人能告訴我這是否是必要的,以及在同步數據庫的情況下序列化數據的優點?

一個在維基百科上關於序列條目用途的狀態它可以用作「用於檢測隨時間變化的數據的變化的方法。」這聽起來非常重要,因爲我的應用程序將查看時間戳以確定更新主數據庫時哪些記錄具有優先級。所以,我想我真的不明白的事情是在Python酸洗數據如何被用來「檢測隨時間變化的數據的變化」,以及這是否會補充使用時間戳的數據庫,以確定優先級或替換此方法完全。

反正,高水平解釋或代碼的例子都是受歡迎的。我只是想弄明白這一點。

由於

+0

一些相關說明:1)請注意,泡菜模塊沒有任何安全保證;如果不受信任的源將創建數據(直接或間接),您將需要使用類似JSON的東西。 2)在使用時間戳時,並不是不可能的(事實上有時很有可能,由於批處理)許多條目將具有完全相同的時間戳(下降到毫秒,甚至可能是微秒)。在這種情況下,你的代碼不應該失敗;你可能需要一個向量時鐘來替換索引,或者修改你的語義。 – ninjagecko 2012-03-22 03:04:50

+0

請注意,通常情況下,爲數據庫序列化對象是一個壞主意 - 它違背數據庫規範化原則,限制訪問數據的方式以及訪問數據的方式。你幾乎總是更適合將它存儲在數據庫中。 – 2012-03-22 03:06:31

回答

0

在python酸洗數據如何被用來「檢測隨時間變化的數據的改變。」

在一個不透明的形式捆綁銷售數據告訴你,絕對沒有關於隨時間變化的數據,但它可能已經可能改變(但你需要通過展開它手動檢查)。什麼文章實際上說的是......

引述實際相關的部分(link to article at this moment in time):

由於這兩種序列化和反序列化可以從通用代碼來驅動,(例如,序列化功能Microsoft Foundation Classes),通用代碼可以同時執行這兩個操作,因此1)可以檢測出序列化的對象與先前的副本之間的差異,以及2)爲下一次檢測提供輸入。沒有必要實際構建先前的副本,因爲可以「即時」檢測到差異。這是一種理解稱爲差分執行的技術[不存在的鏈接]的方法。它是在用戶界面,其內容是隨時間變化的編程有用 - 圖形對象可以被創建,刪除,修改,或由處理的輸入事件,而不必編寫單獨的代碼做這些事情。

術語「差執行」似乎是這個人,他描述了它在另一個StackOverflow的答案杜撰新詞:How does differential execution work?。閱讀這個答案,我想我明白他想說什麼。他好像是用「差分執行」作爲一個MVC風格的概念,在這裏你有很多視圖控件(認爲網頁)的情況下,你要允許增量變化更新只是那些元素,不強迫的全球重繪屏幕。我不會(沒有任何延伸,在我的愚見)調用這個詞的傳統意義上的這個「系列化」,而是「跟蹤過去的」或類似的東西。因爲這基本上和序列化沒有關係,除非你對這個主題感興趣,否則這個答案的剩餘部分(我對他所描述的內容的解釋)可能不值得你花時間去做。


通常,避免全局重繪是不可能的。全局重繪有時必須發生:例如,在HTML中,如果增加元素的大小,則需要重新排列較低的元素,從而觸發重繪。在3D中,您需要重新繪製更新後的所有內容。但是,如果您遵循此技術,則可以減少(儘管不會最小化)重繪次數。他聲稱這種技術將避免使用大多數事件,避免OOP,只使用命令性程序和宏。我的解釋去如下:

  • 你的繪圖功能必須知道,不知何故,如何「抹掉」自己和任何他們這樣做,可能影響的不相關的功能顯示。
  • 撰寫免費sideffect-paintEverything()腳本勢在必行顯示一切(例如使用像paintButton()paintLabel()功能),使用沒什麼,但如果宏/功能。 IF宏就像if語句一樣工作,除了...
  • 每當遇到一個IF分支時,都要跟蹤這是哪個IF語句,以及您所採用的分支。 「這是哪種IF聲明」是一種模糊的概念。例如,您可能決定通過將IF與遞歸結合來實現FOR循環,在這種情況下,我認爲您需要將IF語句跟蹤爲樹(其節點是函數調用或IF語句)。您確保該樹的結構符合優先規則「子佈局選擇取決於此佈局選擇」。
  • 每次發生用戶輸入事件時,請重新運行paintEverything()腳本。但是,因爲我們已經跟蹤哪部分代碼依賴於哪些其他部分,我們可以自動跳過不依賴於更新內容的任何內容。例如,如果paintLabel()不依賴於按鈕的狀態,我們可以避免重新運行paintEverything()腳本的那部分內容。

「序列化」(不是真正的序列化,更像自然序列化的數據結構)來自if分支的執行歷史。除此之外,這裏的序列化完全沒有必要;您所需要的只是跟蹤顯示代碼的哪一部分取決於哪些部分。恰恰如此,如果您將這種技術與串行執行的「smart-if」語句結合使用,則使用延遲評估的執行歷史差異來確定需要更新的內容是有意義的。

但是,這種技術確實有用的東西。我想說的主要內容是:跟蹤依賴不僅僅是OOP風格(例如,不僅僅是窗口小部件A依賴於窗口小部件B),而且還有基本組合器在任何DSL中的依賴關係也是合理的。編程英寸也可以從你的程序結構推斷依賴關係(例如像HTML一樣)。

+0

感謝您的回答。DE是一個有趣的概念,即使你的答案關注於ui編程,我認爲主要思想仍然適用於我同步數據庫的問題。即我需要避免「重新繪製」,或者在對本地(從)數據塊進行更改時重新更新主數據庫中的整個記錄​​,並且只更新每條記錄中的相關字段。問題是,我仍然不知道如何確定哪些變化是最新的變化。我可以序列化和比較數據,如上所述,但這隻會告訴我數據已被更改... – fromabove 2012-03-22 14:28:48

+0

我也可以使用矢量時鐘,正如您在對原始問題的評論中提到的那樣,但是如果有兩個離線數據庫更新相同的記錄,那麼他們不需要共享矢量時鐘?此外,你的答案是非常徹底的,但你能告訴我一個簡單的使用矢量時鐘的代碼示例嗎?我的理解是它幾乎就像一個全局計數器(i = 0),並且每個進程或更新都會將此計數器加1(i ++)。然後,對記錄的最新更改將對應於記錄向量時鐘的最高值。這實質上是嗎? – fromabove 2012-03-22 14:31:46