关系数据库中的"差异"对象

onn*_*odb 9 language-agnostic oop diff

我们的win32应用程序从MySQL关系数据库中的许多表中的数据中组装对象.在这样的对象中,多个修订存储在数据库中.

当存储多个版本的东西时,迟早你会问自己一个问题,如果你可以看到两个版本之间的差异:)所以我的问题是:什么是"差异"两个这样的数据库对象的好方法?

  • 你会在数据库级别进行比较吗?(听起来不是一个好主意:太低级,对架构过于敏感).
  • 你会比较对象吗?
    • 你会编写一个"手动"比较两个对象的属性和字段的函数吗?
    • 你如何存储差异?在一个单独的,通用的"TDiff"对象?
    • 关于如何在用户界面中可视化这些东西的任何一般性建议?

关于您自己的经历的建议或故事非常受欢迎; 谢谢一堆!

用例的额外信息(20090515)

回答安东尼的评论:这个特定的应用程序用于安排由教师团队运营的培训课程.教师的日程安排存储在数据库的各个表中,并包含诸如"她必须在哪一天去哪里","谁是她在团队中的同事"等信息.此信息分布在多个表.

偶尔,我们会"发布"日程安排,以便教师可以在网页上看到它.每个"出版物"都是一个修订版,我们希望能够向用户(以及后来的教师)展示两个出版物之间的变化 - 如果有的话.

希望使场景更有形:)

最后的一些评论

好吧,赏金已经结束,所以我接受了答案.如果以某种方式可以将我的代表中的额外100个分开,并将其提供给其他一些答案,我会毫不犹豫地这样做.你们所有人的帮助都很棒,我非常感激!~Onno 20090519

Har*_*ime 8

只是一个想法,但你是否值得将两个对象版本转换为一些文本格式,然后使用现有的diff程序比较这些文本对象 - diff例如?有很多不错的差异程序,可以提供很好的视觉表示等.

所以举个例子

对象1的文本版本:

first_name: Harry
last_name: Lime
address: Wien
version: 0.1
Run Code Online (Sandbox Code Playgroud)

对象2的文本版本:

first_name: Harry
last_name: Lime
address: Vienna
version: 0.2
Run Code Online (Sandbox Code Playgroud)

差异将是这样的:

3,4c3,4
< address: Wien
< version: 0.1
---
> address: Vienna
> version: 0.2
Run Code Online (Sandbox Code Playgroud)


Ant*_*ony 4

假设一个类有 5 个已知属性 - 日期、时间、主题、大纲、位置。当我查看我的日程安排时,我最感兴趣的是这些属性的最新(即当前/准确)版本。了解发生了什么变化(如果有的话)对我来说也很有用。(顺便说一句,如果日期、时间或地点发生变化,我还希望收到一封电子邮件/短信通知我,以防我不检查更新的时间表:-))

我建议在修改时间表时进行“差异”。因此,当创建该类的版本 2 时,记录哪些值已更改,并将其存储在版本 2 对象上的两个“更改日志”字段中(必须已经有一个父表位于所有表之上 - 使用该表! )。一个变更日志字段是“人类可读文本”,例如“日期从 5 月 1 日星期一更改为 5 月 2 日星期二,时间从上午 10:00 更改为上午 10:30”。第二个更改日志字段是更改字段的分隔列表,例如“日期,时间”为此,在保存之前,您将循环用户提交的值,与当前数据库值进行比较,并连接 2 个字符串,一个是人类可读的,一个是字段名称列表。然后,更新数据并将连接的字符串设置为“更改日志”值。

显示时间表时默认加载当前版本。循环浏览更改日志字段列表中的字段,并注释显示以显示值已更改(* 或突出显示等)。然后,在单独的面板中显示人类可读的更改日志。

如果时间表修改多次,您可能希望合并版本 1 和 2、以及 2 和 3 之间的更改日志。假设在版本 3 中仅课程大纲发生更改 - 如果这是您显示时间表时唯一的更改日志,不会显示对日期和时间的更改。

请注意,这种非规范化方法不太适合分析 - 例如找出哪个特定位置总是有类发生更改 - 但您可以使用 EAV 模型来扩展它来存储更​​改日志。