【问题标题】:In OOP, how does persistence cooperate with object relations?在 OOP 中,持久性如何与对象关系配合?
【发布时间】:2013-07-21 08:51:48
【问题描述】:

所以在 OOP 中,对象向其他对象发送消息。这是一个非常简单的概念,只要所有对象都存在于内存中,就很容易实现,例如通过调用方法。

但在现实生活中,我们将对象保存到数据库或其他地方,因为没有足够的 RAM 来保存所有对象。如何在当前持久化的对象上调用方法?

好的,所以也许可以将未持久化的 one 对象封装到其工厂中。但是如果我想向很多对象发送消息怎么办,例如在一个循环中?一个一个地取消它们是一个经典的 N+1 问题。

好的,我可以有一个存储库,它可以一次性取消所有必要的对象。但是要求存储库获取我的对象不会破坏封装吗?

像观察者这样的模式呢?是否有可能让一个对象订阅任何东西,知道它会被持久化?

是否有任何语言的透明实现?

【问题讨论】:

标签: oop language-agnostic persistence


【解决方案1】:

我认为不会。 RAM 对 OOP 至关重要。一旦你在 RAM 之外持久化了一些东西,它就不再是 OOP。

一个对象实际上是它所接触的所有对象的总和,加上它们所接触的所有对象,再加上...。为了工作,一个对象几乎需要即时通信与许多其他对象。否则,性能将停滞不前。 (想想虚拟内存:如果你曾经在一台 0.5GB 的机器上使用过 1.5GB,你就会知道问题所在。)

基于慢内存的存储倾向于使用关系存储或大块的顺序数据,每个块都通过键随机访问。我编写了大数据、高度交互(以及如此严重的 OO)系统,这些系统将他们的数据保存在 SQL 数据库中。我必须组织数据库,以便可以将其划分为可管理的块,每个块都可以独立存在,其中几个块将被加载到会话中。然后我不得不编写大量代码来将表格、行和列变成有用的对象。要写入数据库,我必须反转整个过程。

因此,要启动程序,数据库数据进入搅拌机并得到完全不同的东西。当用户完成并保存到数据库时,数据被取消混合并放回。内存中的对象与数据库表没有明显的关系(尽管显然可以通过足够的工作从另一个创建一个)。这与我能够达到的可用持久性一样接近。原子单位比对象或行大得多,每次转换都需要一段时间(整秒)。

我已经(非常)一点地使用 ORM。这里的诀窍是 OO 用于模仿关系存储。如果你从一个好的 OO 设计开始,你最终不会得到你会得到的对象,而是得到一个看起来就像一个关系数据库的东西。在很多情况下,这正是您想要的,而且效果很好。但这不是真正的 OOP,可能不是您想要的。

所以我没有找到一般的答案。快速记忆和面向对象——以及慢速记忆和关系/非现实——是两个不同的东西,弥合这种差距需要仔细研究具体案例和一点天才。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2011-03-03
    • 2011-11-28
    • 2021-04-05
    • 2011-04-21
    相关资源
    最近更新 更多