2012-03-22 62 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