c # MongoDB (noRM) - шаблон репозитория со встроенными документами - PullRequest
4 голосов
/ 29 декабря 2010

Я разрабатываю приложение с моделью, аналогичной переполнению стека (вопрос / ответ и т. Д.) Моделирование приложения форума NoSQL с помощью 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 ]

6 голосов
/ 29 декабря 2010

Ваша модель изначально имеет недостатки.

Вопрос должен быть корневым документом.

Ответ должен быть корневым документом.

Несмотря на то, что информация о моделировании документа написана в отношении RavenDB, она в основном используется вами напрямую: http://codeofrob.com/archive/2010/12/21/ravendb-document-design-with-collections.aspx

Редактировать: ПОЭТОМУ, причина, по которой ваша модель имеет недостатки, связана с базами данных документов, в которых вы хотите, чтобы ваши документы моделировали границы транзакций. Подумайте о сценарии редактирования с переполнением стека и о том, как много будет кошмарно поддерживать согласованность с несколькими людьми, добавляющими и обновляющими ответы, которые все изменяют корневой документ, а постер обновляет вопрос. Количество разногласий по одному объекту будет очень проблематичным.

RavenDB предоставляет то, что они называют «исправлениями», что позволяет вам манипулировать частью структуры документа, а не всем документом, именно для решения подобных проблем, но лучше избегать такого дизайна заранее, чем пытаться заставить его работать, значительно увеличивая Сложность вашей персистентной модели - необходимость частичного обновления и обработки сложных ситуаций параллелизма.

И чтобы ответить на конкретный вопрос после этого, у вас будет хранилище ответов и репозиторий ответов на вопросы

0 голосов
/ 29 декабря 2010

Вам не нужно хранилище Ответов. С точки зрения домена, вы должны просто добавить ответ к вашему объекту Question. Репозиторий вопросов должен выполнять свою работу, так как Вопрос выглядит как сводный корень, и у вас должен быть репозиторий для совокупного корня (не для объекта).

Вы должны быть осторожны, чтобы не создать модель анемичного домена .

0 голосов
/ 29 декабря 2010

Я думаю, что будет лучше создать хранилище для каждого совокупного рута (только для Документа с вопросом)

...