C# MongoDB (noRM) - шаблон репозитория со встроенными документами
Я разрабатываю приложение с моделью, аналогичной переполнению стека (вопрос / ответ и т. Д.). Моделирование приложения NoSQL Forum с помощью 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);
}
3 ответа
Ваша модель изначально несовершенна.
Вопрос должен быть корневым документом.
Ответ должен быть корневым документом.
Несмотря на то, что информация о моделировании документа написана в отношении RavenDB, вы в основном можете ее использовать напрямую: http://codeofrob.com/archive/2010/12/21/ravendb-document-design-with-collections.aspx
Изменить: ПОЭТОМУ причина, по которой ваша модель имеет недостатки, связана с базами данных документов, в которых вы хотите, чтобы ваши документы моделировали границы транзакций. Подумайте о сценарии редактирования с переполнением стека и о том, насколько ужасно было бы поддерживать согласованность с несколькими людьми, добавляющими и обновляющими ответы, которые все изменяют корневой документ, а постер обновляет вопрос. Количество разногласий по одному объекту будет очень проблематичным.
RavenDB предоставляет то, что они называют "исправлениями", что позволяет вам манипулировать частью структуры документа, а не всем документом, именно для решения подобных проблем, но лучше избегать такого дизайна заранее, чем пытаться заставить его работать, значительно увеличивая сложность вашего документа. модель постоянства, требующая частичного обновления и обработки сложных ситуаций параллелизма.
И чтобы ответить на конкретный вопрос после этого, у вас будет хранилище ответов и хранилище ответов
Я думаю, что будет лучше создать репозиторий для каждого совокупного рута (только для Документа с вопросом)
Вам не нужно хранилище ответов. С точки зрения домена, вы должны просто добавить ответ к вашему объекту Question. Репозиторий вопросов должен выполнять свою работу, так как Вопрос выглядит как сводный корень, и у вас должен быть репозиторий для совокупного корня (а не для сущности).
Вы должны быть осторожны, чтобы не создавать анемичную модель предметной области.