3

我有几个图表。每个图表的广度和深度可能会有所不同,并且会在运行时发生变化和变更。请参见示例图。

在此处输入图像描述

有一个根节点可以控制整个图(即树)。一个节点可以有几个孩子,每个孩子都有一个特殊的用途。此外,节点可以访问其所有直接子节点以检索某些信息。另一方面,子节点可能不知道它自己的父节点,也不知道其他兄弟节点。到目前为止没有什么壮观的。

存储每个图并使用对象数据库(在本例中为 DB4O)对其进行更新看起来非常简单。我本可以使用关系数据库来实现数据持久性(包括数据库触发器等),但我想用对象数据库来实现它。

我的图表有一个奇怪的地方。请参阅另一个示例图。

在此处输入图像描述

为了正确执行计算,某些节点需要来自其他节点的信息。这些其他节点可能是兄弟姐妹、孩子/孙子或其他类型的相关节点。在这种情况下,特定节点也知道其他相关节点(因此可以直接从它们获取所需信息)。为了简单起见,第一张图片没有显示所有潜在的连接。

如果一个节点发生状态变化(例如由内部计时器触发或由其他节点触发),它将通知其他节点(感兴趣的观察者,另请参见观察者模式)有关更改。然后,每个被通知的节点将采取适当的行动来更新自己的状态(并根据需要通知其他观察者)。根节点不会知道发生的每一个变化,因为只有涉及的节点才会知道某些事情发生了变化。如果这样的事件链是由根节点触发的,那么当然这不是什么大问题。

目的是确保对象数据库的数据持久性。内存中的数据应该与数据库中存储的数据同步。增加复杂性的是图形不包含简单(和愚蠢)的数据节点,而是在每个节点中集成了许多功能(即触发整个图形状态更改的事件)。

我对如何处理提出的问题有几个粗略的想法(例如(1)数据和功能的更强分离或(2)数据库的更强集成或(3)设置任意时间间隔来更新数据并接受数据可能一段时间内不同步)。我正在寻找关于这样一个关键问题的更多输入和选项(这肯定会在具体实施中留下重要的足迹)。

(已编辑)还有一个方面我忘了提。图表不应该一直驻留在内存中。不需要的图将仅存在于数据库中,因此处于暂停状态。这是另一个需要考虑的问题。在暂停期间,更新机制也可能会进入休眠状态,这不是有意的。

4

2 回答 2

1

确切的问题是什么?这里有几点评论:

正如@German 已经提到的:对于复杂的对象图,您可能想要使用透明持久性

同样@German 提到:回调可以帮助您在数据库上读取/写入对象等时执行其他操作。

到观察者模式。您使用的是 .NET 还是 Java?通常您不想将观察者存储在数据库中,因为观察者通常是您的业务逻辑、GUI 等的某些部分。在 .NET 上,事件不会自动存储。在 Java 上,确保将保存观察者引用的字段标记为瞬态。

如果您实际上想要存储观察者,例如因为它们只是对象图中的其他元素。在 .NET 上,您不能存储委托/闭包。所以需要引入一个调用观察者的接口。在 Java 上:我们经常使用匿名内部类作为侦听器:虽然 db4o 可以存储这些,但我不建议这样做。因为匿名内部类会生成可以更改的名称。如果您更改了代码,那么 db4o 稍后将找不到该类。

而已。如果您想了解更多,请提出更详细的问题。

于 2011-12-05T17:08:30.523 回答
1

在 db4o 的情况下,检查“透明激活”以在您遍历图形时按需自动加载对象(这样图形不必全部在内存中)并检查“透明持久性”以允许每个节点持久存在状态改变后的自身。

http://www.gamlor.info/wordpress/2009/12/db4o-transparent-persistence/

此外,您可以使用 db4o“回调”在 db4o 操作期间触发自定义行为。

高温高压

德语

于 2011-12-05T13:02:29.830 回答