我有几个图表。每个图表的广度和深度可能会有所不同,并且会在运行时发生变化和变更。查看示例图。
有一个根节点可以控制整个图(即树)。一个节点可以有多个子节点,每个子节点都有一个特殊的用途。此外,节点可以访问其所有直接子节点以检索某些信息。另一方面,子节点可能不知道自己的父节点,也不知道其他兄弟节点。到目前为止没有什么特别的。
存储每个图形并使用对象数据库(在本例中为 DB4O)更新它看起来非常简单。我本可以使用关系数据库来实现数据持久化(包括数据库触发器等),但我想用对象数据库来实现它。
我的图表有一件奇怪的事情。请参阅另一个示例图。
为了正确执行计算,一些节点需要来自其他节点的信息。这些其他节点可能是 sibling 、 child /孙子或其他一些相关的节点。在这种情况下,特定节点也知道其他相关节点(因此可以直接从它们那里获取所需信息)。为了简单起见,第一张图片没有显示所有潜在的联系。
如果一个节点的状态发生变化(例如,由内部计时器触发或由其他节点触发),它将通知其他节点(感兴趣的观察者,另请参阅 observer pattern)有关更改。每个被通知的节点然后将采取适当的行动来更新自己的状态(并在需要时通知其他观察者)。根节点不会知道发生的每一个变化,因为只有涉及的节点才会知道发生了某些变化。如果这样的一连串事件是由根节点触发的,那么这当然不是什么大问题。
目的是确保对象数据库的数据持久性。内存中的数据应该与数据库中存储的数据同步。增加复杂性的是图表不由简单(和愚蠢的)数据节点组成,而是每个节点中集成了许多功能(即触发整个图表状态更改的事件)。
我对如何处理所提出的问题有几个粗略的想法(例如(1)更强的数据和功能分离或(2)更强的数据库集成或(3)设置任意时间间隔来更新数据并接受该数据可能会在一段时间内不同步)。我正在寻找有关此类关键问题的更多意见和选项(这肯定会在具体实现上留下重要的足迹)。
(已编辑) 还有一个方面我忘记说了。图不应一直驻留在内存中。不需要的图形将仅存在于数据库中,从而处于暂停状态。这是另一个需要考虑的问题。在暂停期间,更新机制也可能会进入休眠状态,这不是故意的。
最佳答案
在 db4o 的情况下,检查“透明激活”以在您遍历图形时按需自动加载对象(这样图形不必全部在内存中)并检查“透明持久性”以允许每个节点在状态更改后保持自身。
http://www.gamlor.info/wordpress/2009/12/db4o-transparent-persistence/
此外,您可以使用 db4o“回调”在 db4o 操作期间触发自定义行为。
HTH
德语
关于graph - 如何用对象数据库实现复杂图的持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359022/