4

我正在开发一个应用程序,其模型类似于 Stack Overflow(问题/答案等...) 使用 C#/ASP.net MVC 建模 NoSQL 论坛应用程序

该模型看起来像这样(简化)

class Question
{
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }

    public string UserName { get; set; }

    public List<Answer> Replies { get; set; }
}

class Answer
{
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }

    public string UserName { get; set; }
}

所以我的文件只是一份文件,其中嵌入了“答案”

我正在尝试为这种方法设计我的存储库。

我应该有 2 个单独的存储库吗?例如:

interface IQuestionRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
}  

interface IAnswerRepository
{
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}

或者是这样的:

interface IPostRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}
4

3 回答 3

6

你的模型本质上是有缺陷的。

问题应该是根文档。

答案应该是根文件。

虽然写的是关于 RavenDB 的文档建模信息,但您大多可以直接使用:http ://codeofrob.com/archive/2010/12/21/ravenb-document-design-with-collections.aspx

编辑: FWIW 你的模型有缺陷的原因是你希望你的文档为事务边界建模的文档数据库。想想堆栈溢出的编辑场景,以及与多人添加和更新答案的一致性,而这一切都会改变根文档,而发帖人正在更新问题,这将是一场噩梦。单个对象的争用量将非常成问题。

RavenDB 提供了他们所谓的“补丁”,它可以让你操作文档结构的一部分而不是整个文档来解决这样的问题,但是最好避免这种设计,而不是试图通过大大增加你的复杂性来使其工作。持久性模型必须进行部分更新并处理复杂的并发情况。

并在此之后回答特定问题,那么您将拥有一个 AnswersRepository 和一个 QuestsionsRepository

于 2010-12-29T20:17:23.623 回答
0

我认为为每个聚合规则创建存储库会更好(仅适用于问题文档)

于 2010-12-29T14:32:30.027 回答
-1

您不需要答案的存储库。从领域的角度来看,您应该只将答案添加到您的 Question 对象中。问题存储库应该完成这项工作,因为问题看起来像一个聚合根,并且您应该为每个聚合根(而不是每个实体)拥有一个存储库。

您应该小心不要创建贫血域模型

于 2010-12-29T20:27:51.343 回答