我有几个图表。每个图的广度和深度可能会有所不同,并且会在运行时发生变化。请参见示例图。
有一个根节点可以控制整个图(即树)。一个节点可以有多个子节点,每个子节点都有一个特殊的用途。此外,节点可以访问其所有直接子节点以检索某些信息。另一方面,子节点可能不知道自己的父节点,也不知道其他兄弟节点。到目前为止没有什么了不起的。
存储每个图形并使用对象数据库(在本例中为 DB4O)更新它看起来非常简单。我本可以使用关系数据库来完成数据持久化(包括数据库触发器等),但我想用对象数据库来实现它。
我的图表有一件很奇怪的事情。请参阅另一个示例图。
为了正确执行计算,一些节点需要来自其他节点的信息。这些其他节点可能是兄弟节点、子节点/孙节点或其他类型的相关节点。在这种情况下,特定节点也知道其他相关节点(因此可以直接从它们获取所需信息)。为简单起见,第一张图片没有显示所有潜在的联系。
如果一个节点的状态发生变化(例如,由内部计时器触发或由其他节点触发),它将通知其他节点(感兴趣的观察者,另见 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/