当我设计文档时,我通常使用链接文档来定义不同文档类型之间的关系。
类似的东西:
EmailDocument
用户
问题是如果用户更改了其名称,旧名称将保留在所有相关文档中。链接文档是一个糟糕的方法还是有一种简单的方法来更新所有这些链接? (我通常创建一个名为User
的类和一个名为UserLink
的类。UserLink
包含在与用户有关系的所有其他文档中。)
答案 0 :(得分:1)
不,我不认为这是一种糟糕的方法,因为在许多情况下它会提高性能。但它确实增加了复杂性,并要求您在父实体更改时(User)有一个更新名称的策略。
围绕这个的常见设计是公开事件 - 当引发事件“UserChangedName”时,你可以拥有一个监听器来更新所有EmailDocument实例中的所有DisplayName。
答案 1 :(得分:1)
相关文章 - How to synchronize changes in nosql db (ravendb)
我只是在EmailDocument中存储一个UserId字段,该字段提供对特定用户的引用。 Raven提供了一个include函数来引入当前会话/查询中的相关文档,没有(或者至少很少 - 毕竟Raven被优化读取)额外的成本和没有额外的GET请求。
http://docs.ravendb.net/consumer/querying/handling-document-relationships.html
var email = session.Include<EmailDocument>(x => x.UserId)
.Load(id);
var user = session.Load<User>(email.UserId);
这将导致一个GET请求拉入两个文档,并且您还将获得用户文档提供的所有其他信息,您可以从两个对象构建视图模型。您还将消除必须跟踪名称更改并在发生这些更改时更新每个文档的开销。