Моделирование приложения форума NoSQL с помощью C# / ASP.net MVC

В настоящее время я разрабатываю приложение на основе форума (вопрос / ответ).
Использование C# ASP.net MVC и MongoDB для хранения данных.

Я сейчас смотрю на модель.
Я думал о том, чтобы иметь отдельные классы, как это: (упрощенно)

public class Question
{
    public string ID { get; set; }

    public string Title { get; set; }
    public string Body { get; set; }
    public List<string> Tags { get; set; }
    public DateTime DateCreated { get; set; }

    public string ForumID { get; set; }
}

Ответ

public class Answer
 {
    public string ID { get; set; }
    public string QuestionID { get; set; }
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }
 }

Мои вопросы:
Как справиться с "ответами"
Я лучше всего иметь (как в модели выше) две отдельные "сущности"
Или я должен иметь список ответов в моей модели вопросов?

Некоторые требования таковы, что мне нужно иметь возможность отображать количество ответов и т. Д.

С учетом того, что это хранится в базе данных NoSQL, я знаю, что я должен денормализовать вещи, но как я могу вставить ответ, не извлекая весь пост? Возможна ли такая операция с использованием NoRM с MongoDB?

2 ответа

Решение

Обычно в MongoDB вы бы встраивали ответы в вопрос. 99% времени вы будете делать запросы по Вопросам, так что вы также можете получить ответы одновременно.

Некоторые требования состоят в том, что мне нужно будет отображать количество ответов...

Если вы возвращаете ответы с вопросами, это действительно легко. У вас будет массив / список / коллекция с ответами. Таким образом, вы просто захватите длину.

но как я могу вставить ответ, не извлекая весь пост

MongoDB поддерживает атомарную операцию "$push". Это означает, что вы можете добавить элемент в массив без фактической загрузки документа с клиента. Из оболочки javascript это будет выглядеть так:

db.questions.update( {_id : your_id}, { $push : { answers : your_answer_object } } );

Так что MongoDB на это способен. Вам нужно проверить драйверы NoRM, чтобы убедиться, что они действительно допускают такой тип поведения (они действительно что-то упускают, если не поддерживают $push).

Ответ должен быть частью вопроса.

открытый класс Question { public string ID { get; задавать; }

    public string Title { get; set; }
    public string Body { get; set; }
    public List<string> Tags { get; set; }
    public DateTime DateCreated { get; set; }

    public string ForumID { get; set; }
    public List<Answers> Answers { get; set; }
}

Из-за отсутствия объединений базы данных документов рекомендуют хранить экземпляры всего графа в одном документе.

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