我正在开发一个类似于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