2010-11-25 3 views
3

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

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

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; } 
} 

Мои вопросы:
Как справиться с "ответы"
Am I лучше иметь (как в приведенной выше модели) два отдельных «объекта»
Или должен ли я иметь список ответов в моей модели вопросов?

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

При этом хранится в БД NoSQL, я знаю, я должен денормализовать вещи, но как может Я вставляю ответ, не получая весь пост? Возможна ли такая операция, используя NoRM с MongoDB?

ответ

6

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

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

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

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

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

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

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

2

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

общественный класс Вопрос { 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; } 
} 

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