2

我有一个 C++ 应用程序,它从数据库加载大量数据,然后对这些数据执行算法(这些算法是 CPU 和数据密集型的,所以我事先加载了所有数据),然后保存所有数据改回数据库。

数据库部分与应用程序的其余部分很好地分开。事实上,应用程序不需要知道数据来自哪里。应用程序甚至可以在文件上启动(在这种情况下,一个单独的文件模块将文件加载到应用程序中,最后将所有数据保存回文件)。

现在:

  • 数据库层只想将更改的实例保存回数据库(而不是完整的数据),因此它需要知道应用程序更改了哪些内容。
  • 另一方面,应用程序不需要知道数据来自哪里,因此它不想被迫为每个数据实例保持一个更改状态。

为了使我的应用程序及其数据结构与加载和保存数据的层(可以是数据库或文件)尽可能分离,我不想用有关实例自启动以来是否更改的信息污染应用程序数据结构或不。

但是为了使数据库层尽可能高效,它需要一种方法来确定应用程序更改了哪些数据。

复制所有数据并在保存时比较数据不是一种选择,因为数据很容易填满几 GB 的内存。

将观察者添加到应用程序数据结构中也不是一种选择,因为应用程序算法中的性能非常重要(循环遍历所有观察者并调用虚函数可能会导致算法中的重要性能瓶颈)。

还有其他解决方案吗?或者如果我不想以侵入性方式向我的应用程序类添加逻辑,我是否试图过于“模块化”?在这些情况下,务实一点会更好吗?

ORM 工具是如何解决这个问题的?它们是否还强制应用程序类保持某种变化状态,或者它们是否强制这些类具有变化观察器?

4

1 回答 1

1

如果您无法复制数据并进行比较,那么显然您需要在某处记录已更改的内容。那么,问题是如何更新这些记录。

ORM 工具可以(如果他们愿意)通过在对象中保留标志来解决问题,说明数据是否已更改,如果更改了怎么办。听起来好像您正在为应用程序提供原始数据结构,而不是具有可以更新标志的整齐封装的变量的对象。

因此,ORM 通常不需要应用程序跟踪任何非常详细的更改。应用程序通常必须说明要保存哪些对象,但 ORM 然后会计算出需要持久保存到数据库的内容才能做到这一点,并可能在那里应用优化。

我想这意味着在您的术语中,ORM 在某种松散的意义上向数据结构添加了观察者。它不是外部观察者,它是知道如何改变自身的对象,但当然要记录发生的变化需要一些开销。

一种选择是为您的数据结构提供“慢速”突变器,它更新标志,“快速”直接访问,以及一个标记对象脏的函数。然后,应用程序可以选择是使用允许它忽略问题的可能较慢的修改器,还是使用可能更快的修改器,它要求它在对象开始之前(或者在它完成之后,可能取决于什么你处理事务和不一致的中间状态)。

然后,您将有两种基本情况:

  • 我正在循环一个非常大的对象集,有条件地对其中一些对象进行一次更改。为了应用程序的简单性,使用“慢”突变器。
  • 我对同一个对象进行了许多不同的更改,我真的很关心访问器的性能。使用“快速”突变器,它可能会直接暴露数据中的一些数组。您可以通过了解更多关于持久性模型的信息来获得性能。

计算机科学中只有两个难题:缓存失效和命名事物。

菲尔·卡尔顿

于 2010-11-04T17:29:58.860 回答