我正在尝试开发一个系统,允许用户更新笔记本电脑上的本地离线数据库,并在重新连接到网络后,将他们的dbs与主数据库同步。
我查看了MySQL复制,但该文档侧重于单向同步。所以我想我会在python中构建一个自定义应用程序(双边同步),我有几个问题。
我已经阅读了几篇有关此问题的帖子,其中一个被动提及的项目是序列化(我将通过python中的pickle和cPickle模块实现)。有人可以告诉我这是否有必要,以及在同步数据库的情况下序列化数据的好处吗?
维基百科在序列化状态条目中的一个用途是它可以用作"一种检测时变数据变化的方法。"这听起来非常重要,因为我的应用程序将查看时间戳,以确定在更新master数据库时哪些记录具有优先权。所以,我想我真正得到的东西是如何使用python中的酸洗数据来检测时变数据的变化,以及是否可以使用时间戳补充用于确定优先级的数据库或完全替换此方法。
无论如何,高级别的解释或代码示例都是受欢迎的。我只想弄明白这一点。
由于
答案 0 :(得分:0)
python中的酸洗数据如何用于“检测时变数据的变化。”
以不透明的格式捆绑数据绝对不会告诉您任何关于时变数据的信息,除了它可能 可能已更改(但您需要手动检查)通过展开它)。文章实际上说的是......
引用实际相关部分(link to article at this moment in time):
由于序列化和反序列化都可以从公共代码驱动(例如,Microsoft基础类中的Serialize函数),因此公共代码可以同时执行这两个操作,因此1)检测之间的差异被序列化的对象及其先前的副本,以及2)为下一次这样的检测提供输入。没有必要实际构建先前的副本,因为可以“动态”检测差异。这是一种理解差异执行技术[一种不存在的链接]的方法。它对于内容随时间变化的用户界面的编程非常有用 - 可以创建,删除,修改或处理图形对象来处理输入事件,而无需编写单独的代码来执行这些操作。
术语“差异执行”似乎是由这个人创造的新词,他在另一个StackOverflow答案中描述了它:How does differential execution work?。阅读这个答案,我想我明白他想说的是什么。他似乎在使用“差异执行”作为MVC风格的概念,在你有很多视图小部件(想想一个网页)的环境中你想要允许增量更改来更新这些元素,而不强制全局重绘屏幕。我不会在经典意义上将这种“序列化”称为“序列化”(在我的拙见中不是任何延伸),而是“跟踪过去”或类似的东西。因为这基本上与序列化无关,所以这个答案的其余部分(我对他所描述的内容的解释)可能不值得你花时间,除非你对这个主题感兴趣。
通常,避免全局重绘是不可能的。有时必须进行全局重绘:例如,在HTML中,如果增加元素的大小,则需要重排较低的元素,从而触发重绘。在3D中,您需要重新绘制更新后的所有内容。但是,如果您遵循此技术,则可以减少(尽管不是最小化)重绘次数。他声称这种技术将避免使用大多数事件,避免使用OOP,并且只使用命令式过程和宏。我的解释如下:
paintEverything()
脚本,强制显示所有内容(例如使用paintButton()
和paintLabel()
等函数),只使用IF宏/函数。 IF宏就像if语句一样工作,除了...... paintEverything()
脚本。但是因为我们已经跟踪代码的哪一部分取决于哪些部分,我们可以自动跳过任何不依赖于更新内容的内容。例如,如果paintLabel()
不依赖于按钮的状态,我们可以避免重新运行paintEverything()
脚本的那一部分。“序列化”(不是真正的序列化,更像是自然序列化的数据结构)来自if分支的执行历史。除此之外,根本不需要序列化;您所需要的只是跟踪显示代码的哪一部分取决于哪些其他部分。碰巧的是,如果你将这种技术用于串行执行的“smart-if”语句,那么使用延迟评估的执行历史差异来确定你需要更新的内容是有意义的。
然而,这项技术确实有用。我要说的主要内容是:跟踪依赖关系不仅仅是OOP风格(例如不仅仅是小部件A取决于小部件B),而且基本组合器在任何DSL中的依赖关系也是合理的。编程。也可以从程序结构中推断出依赖关系(例如像HTML一样)。