Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RavenDB关系模型_C#_Relationship_Ravendb_Forum_Document Database - Fatal编程技术网

C# RavenDB关系模型

C# RavenDB关系模型,c#,relationship,ravendb,forum,document-database,C#,Relationship,Ravendb,Forum,Document Database,我正在做一个附带项目,创建一个建立在RavenDB之上的论坛。我目前正试图找出主题作者和主题“最后回复”用户之间的关系。在一个典型的关系模型中,我只需将FK存储给发布主题的用户,并将其连接到replies表以获取最新的回复作者。这显然不是Raven或任何文档存储的用例 实现这一目标的最佳方式是什么?目前我正在考虑一些想法 想法1: 在主题模型上保存作者的FK,添加一个JsonIgnored用户对象,我将使用会话加载中的Include在主题加载中填充该对象(因此,一个远离客户端的请求只会使加载本身

我正在做一个附带项目,创建一个建立在RavenDB之上的论坛。我目前正试图找出主题作者和主题“最后回复”用户之间的关系。在一个典型的关系模型中,我只需将FK存储给发布主题的用户,并将其连接到replies表以获取最新的回复作者。这显然不是Raven或任何文档存储的用例

实现这一目标的最佳方式是什么?目前我正在考虑一些想法

想法1: 在主题模型上保存作者的FK,添加一个JsonIgnored用户对象,我将使用会话加载中的Include在主题加载中填充该对象(因此,一个远离客户端的请求只会使加载本身和模型有点复杂)。然后可能使用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; }
}

注意:我可能会在用户模型中添加一个方法,以返回一个“干净”的版本,在该版本中,我删除了密码哈希之类的内容,并在Save for Idea 2上使用它。

根据您的需要,在更新和查询性能方面,两种方法都可能是更好的选择

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

如果您的数据处理与数据检索分离,并且在将数据转换到前端时您没有访问数据库会话的权限,则嵌入文档(如Idea 1,但具有用户的存储值)可能会更好。我们使用的系统严重依赖于此(获取一个输入并映射出值的json挂件)——这将数据检索逻辑与输出逻辑(如映射到json)完全分离。 缺点:您必须确保现有(嵌入式)数据在用户更改时得到更新,并且通过线路传输的数据比idea 1上传输的数据更多