Моделирование приложения форума 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; }
}
Из-за отсутствия объединений базы данных документов рекомендуют хранить экземпляры всего графа в одном документе.