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. Репозиторий вопросов должен выполнять свою работу, так как Вопрос выглядит как сводный корень, и у вас должен быть репозиторий для совокупного корня (а не для сущности).

Вы должны быть осторожны, чтобы не создавать анемичную модель предметной области.

Другие вопросы по тегам