【问题标题】:Implementing a big collection entity without loading data into memory实现一个大集合实体而不将数据加载到内存中
【发布时间】:2013-03-18 08:13:22
【问题描述】:

我正在使用 addImage($imageId)、removeImage($imageId), getImages($from, $count)。

在物理上,数据(图像 ID 的集合)存储在应用程序级存储中,它提供了很好的功能,例如 addItem($keyName, $item, $weight), removeItem($keyName, $item), getItems ($key, $from, $count )。

如何使模型以 DDD 样式使用这个外部(从域中查找)存储,而不引用 UserImages 实体的存储?重要的是,我不想像传统方法假设的那样将所有集合从存储加载到实体。

希望我对问题提供了很好的解释,如果没有,请告诉我。非常感谢您的帮助。

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    UserImages 听起来不像一个实体,而更像是一个服务存储库,您已经有一个实现 -应用级存储。您可能希望将其公开为 UserImageRepositoryrepository 更适合您所拥有的名称。更一般地,每当您有一个关联的一端可能具有非常大的基数时,请考虑implementing this association as a repository 而不是直接对象引用。实体和聚合应该是一致性边界,不一定是它们所代表的概念的完整体现。另外,请查看 Effective Aggregate Design 以深入了解此主题。

    【讨论】:

    • eulerfx,非常感谢您的提示。这真的很有意义。现在我正在彻底修改我的架构。
    【解决方案2】:

    首先,延迟加载是 DDD 中的一种反模式,当且仅当实体提供对比保持其不变量所需的更多数据的访问权限时,您才需要它。为了解决这个问题,您可以改用shared identifiers

    要解耦域逻辑和持久性问题,您可以使用observable entities:提供实体的存储库不断观察它,以便在发生适当的域事件时,它可以持久化更改。但是,如果您使用 PHP 进行编码,则必须手动编写观察者模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      相关资源
      最近更新 更多