如何在RavenDB中存储对任意实体的引用?

时间:2013-05-15 22:41:29

标签: domain-driven-design ravendb

我需要在Raven数据库中存储对实体的任意引用。有时,实体是聚合根(请参阅下面的事件),有时它是值实体(请参阅下面的会话)。我目前正计划将引用存储为Lucene查询(或类似Lucene的语法)。有没有人做过这样的事情?我是走在艰难的道路上吗?

我的一些担忧是:

  • 价值实体不太可能提供标识符,我能期望可靠地引用价值实体吗?
  • 个别实体应该不知道(脱离)任意关系基础设施,推断复杂对象图中查询的最佳方法是什么?
  • 将关系限制为仅聚合根(并阻止对值实体的引用)可以简化问题,但这需要我重构我的事件/会话文档。我希望这两个系统保持分离(一方的担忧不应影响另一方。)

我在下面列出了示例文档来说明我的方案。任何想法,想法,指导或例子都将非常感激。

Events Collection
{
  Id: “30f6...54a7”,
  Title: “Annual Meeting”
  Sessions: [
    { 
      Code: “COM001”, 
      Title: “Opening Ceremony” 
    },
    { 
      Code: “TEC201”, 
      Title: “Intermediate Tech” 
    }
  ]
}

People Collection
{
  Id: "45a8...f209",
  Name: "Chad"
}

Arbitrary Relationships Collection
{
  Id: “b613...8ebb”,
  SubjectEntityQuery: "People.Id:45a8...f209",
  TargetEntityQuery: “Events.Id:30f6...54a7.Sessions,Code:COM001”,
  Action: "Attended Session",
  Story: "Chad attended the Opening Ceremony session"
}

修改

我想提供关于任意关系的更多细节。我们将能够扩展系统以响应系统事件并记录两个实体之间的交互。我们有比Events,Sessions和People更多的实体。该关系可以是共享链接的人或关于主题标签的推文。实际上,任意关系集合变成了一个类似图形的结构,它允许我们查看给定实体的所有〜交互。

1 个答案:

答案 0 :(得分:2)

这是尖叫的关系设计。

最简单的方法是将Relationship作为一个对象,使其Subject和Target字段成为一个字符串数组,其中包含它引用的实际文档的ID。这样,您可以利用“包含”将它们与关系文档一起加载。无论如何,我没有看到存储Lucene查询语法如何帮助。

可能有更好的方法对此进行建模,但这实际上取决于您的业务模式以及您尝试实现的目标。

此外,您可能想要删除GUID ID,只需使用Raven的约定。