【问题标题】:CQRS/EventStore - Modelling and storing hierarchical treeCQRS/EventStore - 建模和存储分层树
【发布时间】:2012-02-09 17:04:40
【问题描述】:

我想知道是否有人解决了将 CQRS 和 Event-Sourcing (Event-Store) 与分层树一起使用的问题?

我们希望树中有 1000 个节点和子节点中的 10 个,我担心带有事件源的 CQRS 是否不能很好地解决这个问题。我还没有看到可以在事件存储方面使用的快照。

同样从 DDD 的角度来看,我是将其建模为我的模型中的复合设计模式,还是应该更能反映数据在我的读取模型(即本例中的 SQL 服务器)中的存储方式。

【问题讨论】:

  • 这些节点之间存在哪些不变量/一致性规则?节点代表什么?你在二叉树领域工作吗?
  • 描述它的最佳方式是 iTunes 类型的树形结构,我们允许用户上传视频。可能有许多子文件夹(艺术家姓名/专辑等)。绝对不在二叉树的领域。我们可以允许用户删除文件夹(这将删除视频)、在文件夹之间移动视频、删除视频以及将视频从一个文件夹复制到另一个文件夹。
  • 我只需要顺着树向下并延迟加载每个子树,然后如果用户选择了一个子树,那么就延迟加载它的子树。除了您可以使用类似 Windows Explorer 树的结构之外,我看不到任何其他要求。
  • 看起来很粗鲁,在 UI 领域解决了很多次(现成的组件)......看不到与 DDD 的相关性。在这种情况下,您希望从使用 eventsourcing/cqrs 获得什么价值?为什么不将简单的模型节点作为单独的(数据)实体来完成呢?使用数据模型,而不是域模型,IMO。
  • 一方面,您需要能够将这些权限传播到后代节点。您可以为此使用消息传递或批量更新(SQL 非常擅长基于集合的操作)。如果我说“简单节点模型”,我并不是说你不能使用 OO。为您的节点建模,使其封装其直接子节点(或引用标识符)和适用的权限集。对节点行为中的权限断言进行编码。这会使其成为域模型吗?可能是,但我怀疑规则是不断变化的:-)。因此,它不是,IMO。

标签: domain-driven-design cqrs


【解决方案1】:

我倾向于同意 cmets,即 CQRS 对您的应用程序确实没有优势。不合适。

为了其他人的利益回答您最初的问题,我正在构建一个使用 CQRS 和 EventSourcing 的供应应用程序,该应用程序具有基本上是分层树的内容。我正在使用图形数据库 [ Neo4J ] 来处理层次结构... [ 6 - 8 个不同级别的许多组]。

域反映了自下而上的关系,而 Neo4J 将处理两个方向。这样,eventStore 可以非常快速地更新,对于那些需要遍历树/图 [以创建可访问节点列表] 的处理程序,他们可以使用 Graphing Database。

CQRS 实际上非常适合这个应用程序,实际上我很惊讶我的方法没有受到任何阻碍。每个人似乎都同意,这是比更传统的 CRUD 方法更好的替代方案。

我要替换的系统将这些关系存储在 SQL 中,这就是存在巨大性能问题的地方!这应该会好很多。

【讨论】:

  • 丹尼尔,你的活动是怎样的?
  • 其中有很多,而且它们是特定于域的.. 诸如“StudentAdded”、“StudentEnrolled”或“UserChangedSchools”之类的东西。不确定您要查找的具体内容。
  • 是的,这回答了我的问题。谢谢。
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2012-02-26
相关资源
最近更新 更多