【问题标题】:RavenDB Relational ModelRavenDB 关系模型
【发布时间】:2016-06-12 16:25:59
【问题描述】:

我正在做一个业余项目,以创建一个基于 RavenDB 的论坛。我目前正在尝试确定主题作者与某个主题的“最后回复”用户之间的关系。在典型的关系模型中,我只需将 FK 存储给发布主题的用户,并连接到回复表以获取最新回复作者。这显然不是 Raven 或任何文档存储的用例。

实现这一目标的最“最佳”方式是什么?目前我正在折腾几个想法。

想法 1: 将作者的 FK 保存在主题模型上,添加一个 JsonIgnored User 对象,我将通过在我的会话加载中使用包含来填充主题加载(因此,到目前为止,客户端的一个请求只是使加载本身和模型有点复杂)。然后可能使用 map-reduce 索引来获取最近的回复作者(或者甚至与获取主题作者的方法相同,因此需要 1 或 2 个查询)。

想法 2: 在模型上保存作者和最近回复的用户。这里的主要“问题”是陈旧数据的可能性(比如用户名更改)。然而,这可能会通过后台任务得到缓解(或者在更新用户文档并返回用户的所有帖子时牢记这一点)。

相关模型的示例。

public class User
{
    public string Id { get; set; }
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
}

public class Topic
{
    public string Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }

    // Idea 1 Relationships
    public string AuthorId { get; set; }
    [JsonIgnore]
    public User Author { get; set; } // Would need to be populated on loads from an Include on AuthorId
    public string MostRecentReplyUserId { get; set; }
    [JsonIgnore]
    public User MostRecentReplyUser { get; set; } // Same as Author

    // Idea 2 Relationships
    public User Author { get; set; }
    public User MostRecentReplyUser { get; set; }
}

注意:我可能会在 User 模型中添加一个方法来返回一个“干净”的版本,在该版本中我会清除 PasswordHash 之类的内容并将其用于 Save for Idea 2。

【问题讨论】:

    标签: c# relationship ravendb forum document-database


    【解决方案1】:

    根据您对更新和查询性能的需求,两种方式可能是更好的选择。

    我个人会推荐第一个想法,因为当用户记录上的某些数据发生变化时,您不需要更新现有文档。在查询/加载时使用 include 是 ravendb 的一个很好的功能,它可以帮助您从数据库中检索嵌套记录。 只要确保您不要忘记包含所有嵌套文档 - 否则您可能会得到很多往返。

    如果您的数据处理与数据检索分开,并且在将要分发的数据转换为前端。我们正在使用这样一个严重依赖它的系统(获取一个输入并映射出该值的 json 挂件) - 这将数据检索逻辑与输出(如映射到 json)逻辑完全分开。 这里的缺点:您必须确保在用户更改时更新现有(嵌入式)数据,并且通过网络传输的数据比想法 1 更多。

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多