当我设计文档时,我通常使用链接文档来定义不同文档类型之间的关系。设计链接对象
喜欢的东西:
EmailDocument
- 编号
- 主题
- UserLink
- 显示名称
- 用户ID
用户
- 编号
- 姓
- 名字
的问题是,如果用户改变它的名字,旧名留在所有相关文件。链接文档是不好的方法还是有更新所有这些链接的简单方法? (我通常会创建一个名为User
和一个叫UserLink
类。UserLink
包括在具有相对于用户的所有其他文件。)
当我设计文档时,我通常使用链接文档来定义不同文档类型之间的关系。设计链接对象
喜欢的东西:
EmailDocument
用户
的问题是,如果用户改变它的名字,旧名留在所有相关文件。链接文档是不好的方法还是有更新所有这些链接的简单方法? (我通常会创建一个名为User
和一个叫UserLink
类。UserLink
包括在具有相对于用户的所有其他文件。)
不,我不认为这是一个不错的办法,因为它会提高性能在许多情况下。但它确实增加了复杂性,并且需要您在父实体更改(用户)时更新名称的策略。
一个常见的设计是暴露事件 - 当引发事件“UserChangedName”时,您可以让侦听器更新所有EmailDocument实例中的所有DisplayName。
相关这里后 - How to synchronize changes in nosql db (ravendb)
我只是存储提供给特定用户的引用EmailDocument内用户ID字段。 Raven提供了一个包含函数,用于在当前会话/查询中提取相关文档,但没有(或者至少非常少的 - 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请求,你也有所有用户文档提供了更多的信息,你可以从两个对象建立你的视图模型。您还将消除必须跟踪名称更改并在发生这些更改时更新每个文档的开销。