设计链接对象

本文关键字:对象 链接 | 更新日期: 2023-09-27 18:13:36

在设计文档时,我通常使用链接文档来定义不同文档类型之间的关系。

类似:

EmailDocument

  • Id
  • <
  • 主题/gh>
  • UserLink
      <
    • DisplayName/gh>
    • UserId
用户

  • Id
  • FirstName
  • LastName

问题是,如果用户更改了名称,则所有相关文档中都保留了旧名称。链接文档是一种糟糕的方法,还是有一种简单的方法来更新所有这些链接?(我通常创建一个名为User和一个名为UserLink的类。UserLink包含在与用户有关系的所有其他文档中。

设计链接对象

不,我不认为这是一个坏方法,因为它在许多情况下会提高性能。但是它确实增加了复杂性,并且要求您有一个策略来在父实体更改时更新名称(User)。

一个常见的设计是公开事件-当事件"UserChangedName"被引发时,你可以有一个监听器来更新所有EmailDocument实例中的所有DisplayName。

如何同步nosql db (ravendb)中的更改

我只是在EmailDocument中存储一个UserId字段,该字段提供对特定User的引用。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请求拉入两个文档,并且您还将拥有User文档提供的所有附加信息,您可以从两个对象构建视图模型。您还可以省去跟踪名称更改和在发生更改时更新每个文档的开销。