问题
我们有一个将分层数据存储在数据库中的应用程序。我们已经定义了一个代表一行数据的 POCO 对象。
问题是我们需要某些属性依赖于项目的子项,而其他属性依赖于它们的祖先。例如,如果一个((大)孙)孩子的状态不完整,那么它的所有父母都是不完整的。同样,如果父级的状态为禁用,则所有子级也应被隐式禁用。
在数据库方面,由于触发器,一切正常。但是,我们遇到的问题是将这些更改同步到任何可能受到影响的内存中 ORM 对象。
这就是为什么我们要考虑做这一切的原因,我们需要确保内存中只有一个模型实例用于数据库中的任何特定行。这就是整个问题的症结所在。
我们目前正在使用数据库中的触发器以及对内存中 ORM 对象的数据库 ID 上键入的对象的一个巨大的弱引用散列集进行此操作,但我们不确定这是正确的方法。
初始设计
我们的“新手”设计从加载数据库中的所有对象开始,这很快就会耗尽内存,更不用说加载可能永远不会真正显示在 UI 中的数据了,因为用户可能永远不会导航到它。
尝试 2
我们的下一个尝试扩展了前者,仅动态加载 UI 中实际显示所需的级别,这大大加快了加载速度,但现在不允许在没有多次调用数据库的情况下轮询层次结构的状态。
尝试 2B
与上面类似,但我们添加了持久的“隐式状态”字段,这些字段通过数据库中的触发器进行更新。这样,如果禁用了父级,则触发器会相应地更新所有子级。然后模型对象简单地用数据库中的最新值刷新自己。这具有将一些业务逻辑放在模型层和一些在数据库触发器中以及使每个操作都需要数据库写入和读取的缺点。
全动态
这一次我们试图让我们的模型“哑”,并从代码中完全删除我们的业务层,将该逻辑完全移动到数据库中。这样,业务规则只有单一所有权。另外,这种保证的坏数据一开始就不能插入到数据库中。但是,在这里我们也需要不断地轮询数据库以获取“当前”值,这意味着必须内置一些逻辑才能知道需要刷新哪些对象。
完全动态的元数据
与上面类似,但所有对数据库的写入调用都返回了一个更新令牌,该令牌告诉模型是否必须刷新任何加载的父级或子级。
我希望从 SO 社区获得一些关于如何解决这个问题的反馈。