我有几个图表。每个图表的广度和深度可能会有所不同,并且会在运行时发生变化和变更。请参见示例图。
有一个根节点可以控制整个图(即树)。一个节点可以有几个孩子,每个孩子都有一个特殊的用途。此外,节点可以访问其所有直接子节点以检索某些信息。另一方面,子节点可能不知道它自己的父节点,也不知道其他兄弟节点。到目前为止没有什么壮观的。
存储每个图并使用对象数据库(在本例中为 DB4O)对其进行更新看起来非常简单。我本可以使用关系数据库来实现数据持久性(包括数据库触发器等),但我想用对象数据库来实现它。
我的图表有一个奇怪的地方。请参阅另一个示例图。
为了正确执行计算,某些节点需要来自其他节点的信息。这些其他节点可能是兄弟姐妹、孩子/孙子或其他类型的相关节点。在这种情况下,特定节点也知道其他相关节点(因此可以直接从它们获取所需信息)。为了简单起见,第一张图片没有显示所有潜在的连接。
如果一个节点发生状态变化(例如由内部计时器触发或由其他节点触发),它将通知其他节点(感兴趣的观察者,另请参见观察者模式)有关更改。然后,每个被通知的节点将采取适当的行动来更新自己的状态(并根据需要通知其他观察者)。根节点不会知道发生的每一个变化,因为只有涉及的节点才会知道某些事情发生了变化。如果这样的事件链是由根节点触发的,那么当然这不是什么大问题。
目的是确保对象数据库的数据持久性。内存中的数据应该与数据库中存储的数据同步。增加复杂性的是图形不包含简单(和愚蠢)的数据节点,而是在每个节点中集成了许多功能(即触发整个图形状态更改的事件)。
我对如何处理提出的问题有几个粗略的想法(例如(1)数据和功能的更强分离或(2)数据库的更强集成或(3)设置任意时间间隔来更新数据并接受数据可能一段时间内不同步)。我正在寻找关于这样一个关键问题的更多输入和选项(这肯定会在具体实施中留下重要的足迹)。
(已编辑)还有一个方面我忘了提。图表不应该一直驻留在内存中。不需要的图将仅存在于数据库中,因此处于暂停状态。这是另一个需要考虑的问题。在暂停期间,更新机制也可能会进入休眠状态,这不是有意的。