我正在开发一个应用程序,其模型类似于 Stack Overflow(问题/答案等...) Modelling a NoSQL Forum Application with C# / ASP.net MVC
模型看起来像这样(简化)
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);
}
最佳答案
您的模型存在固有缺陷。
问题应该是根文档。
答案应该是根文档。
虽然是针对 RavenDB 编写的,但文档建模信息大部分可供您直接使用:http://codeofrob.com/archive/2010/12/21/ravendb-document-design-with-collections.aspx
编辑: FWIW 您的模型存在缺陷的原因在于您希望您的文档对事务边界建模的文档数据库。想一想堆栈溢出的编辑场景,以及保持与多个人添加和更新答案的一致性将是多么噩梦,这些答案都会改变根文档,而张贴者正在更新问题。单个对象的争用量会很成问题。
RavenDB 提供了他们所谓的“补丁”,让您可以操纵文档结构的一部分而不是整个文档来解决这样的问题,但最好预先避免这种设计,而不是试图通过大大增加您的持久性模型的复杂性必须进行部分更新并处理复杂的并发情况。
然后回答具体问题,然后你会有一个 AnswersRepository 和一个 QuestsionsRepository
关于c# MongoDB (noRM) - 带有嵌入式文档的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4554755/