【问题标题】:DDD / Storing domain events in the graph databaseDDD / 在图形数据库中存储领域事件
【发布时间】:2014-02-28 22:21:50
【问题描述】:

我拥有一个使用 Neo4j 作为图形数据库的应用程序。
为了实现命令模式和优化我的请求(页面请求),我分离了读写(遵循 CQRS 建议),整个共享同一个数据库:neo4j 数据库。 (不是两个不同的)

现在我计划存储一些域事件,如 UserRegisteredEvent 等,以便由托管在 Actors (Akka) 中的一些事件处理程序出列。

将域事件存储在共享数据库中是否有意义,在我的例子中是简单的 Neo4j 节点?
还是我真的需要一个 tierce 数据库,例如 MySQL?

我确切地说我的解决方案不需要事件溯源。

【问题讨论】:

  • 在看 Neo4j 时,我突然有了同样的想法,所以其他人肯定也在考虑这个吗?这似乎很有意义,因为事件与图形密切相关,因此图形数据库似乎是显而易见的选择......你有没有进一步研究过这个?
  • @Schalk 最后,我通过与相应节点“模型”建立直接关系来存储事件。如果事件是“UserCreatedEvent”,我创建一个链接到“User”的节点“UserCreatedEvent”。我有一个调度程序,它检索所有新事件以通过 Label "New" (Neo4j 2.0) 处理。

标签: architecture neo4j domain-driven-design cqrs


【解决方案1】:

如果您可以以某种方式关联存储的事件,或者您想向这些事件添加更多信息,这些信息可以用关系或仅属性表示,那么图形数据库(在您的情况下为 neo4j)是可行的方法,因为查询将比(或不是这样)标准化的 rdbms 快得多。

此外,将来您可以轻松添加更多属性,而无需处理 SQL 和已添加实体的缺失属性。

所以从我的角度来看,将事件节点添加到共享 neo4j 数据库是一种更好的方法,即使对于简单的节点也是如此,因为查询是在子图中进行的,它不会影响您的业务领域。

【讨论】:

  • 这正是我的想法 :) 谢谢
  • 甚至不需要序列化事件,因为 Neo4j 是 NoSql 数据库,这意味着没有模式。
  • 很高兴我们在同一页上 :) 但请选择一个答案或将其修改为 wiki。
【解决方案2】:

我对 Neo4j 不太了解,但没有规则说您必须使用 RDBMS 作为事件存储 - 只要您可以基于序列写入和读取一组事件(作为序列化/反序列化的对象)在聚合 id 上然后你的好。

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多