C# 设计链接对象

C# 设计链接对象,c#,nosql,ravendb,C#,Nosql,Ravendb,当我设计文档时,我通常使用链接文档来定义不同文档类型之间的关系 比如: 电子邮件文档 身份证 主题 用户链接 显示名 用户ID 用户 身份证 名字 姓氏 问题是,如果用户更改了名称,则旧名称将保留在所有相关文档中。链接文档是一种糟糕的方法,还是有一种简单的方法来更新所有这些链接?(我通常创建一个名为User的类,一个名为UserLink,UserLink的类包含在与用户相关的所有其他文档中。)不,我认为这不是一个坏方法,因为它在许多情况下都会提高性能。但它确实增加了复杂性,并要求您在

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

比如:

电子邮件文档

  • 身份证
  • 主题
  • 用户链接
    • 显示名
    • 用户ID
用户

  • 身份证
  • 名字
  • 姓氏

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

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

围绕这一点的一个常见设计是公开事件-当引发事件“UserChangedName”时,您可以使用一个侦听器更新所有EmailDocument实例中的所有DisplayName。

此处的相关帖子-

我只需要在EmailDocument中存储一个UserId字段,该字段提供对特定用户的引用。Raven提供了一个include函数,可以在当前会话/查询中拉入相关文档,而不需要额外的成本(或者至少很少——Raven毕竟是读优化的),也不需要额外的GET请求

var email=session.Include(x=>x.UserId)
.负载(id);
var user=session.Load(email.UserId);
这将导致一个GET请求拉入两个文档,您还将获得用户文档提供的所有附加信息,您可以从这两个对象构建视图模型。您还将消除必须跟踪名称更改以及在发生更改时更新每个文档的开销

var email = session.Include<EmailDocument>(x => x.UserId)
                   .Load(id);

 var user = session.Load<User>(email.UserId);