Допустим, у меня есть такой сайт, как digg.com У меня есть куча статей, и люди могут голосовать за статьи, которые им нравятся.MongoDB Schema Design - Голосование по сообщениям
Я хочу, чтобы иметь возможность запрашивать статьи с наибольшим количеством голосов за определенное время (последний час, последний день, на прошлой неделе), упорядоченный по количеству голосов.
Как обычно, с MongoDB существует несколько способов реализации этого, но я не уверен, какой из них правильный.
- сообщений документ, который содержит массив голосов - голосов сами документы, содержащие идентификатор пользователя, имя пользователя и дату голосования:
{
"_id": "ObjectId(xxxx)",
"title": "Post Title",
"postdate": "21/02/2012+1345",
"summary": "Summary of Article",
"Votes": [
{
"userid":ObjectId(xxxx),
"username": "Joe Smith",
"votedate": "03/03/2012+1436"
},
]
}
- раздельный сбор голосов, содержащие сведения о личности голосование и ссылку на пост, который был признан на:
{
"_id": "ObjectId(xxxx)",
"postId": ObjectId(xxxx),
"userId": ObjectId(xxxx),
"votedate": "03/03/2012+1436"
}
Первый из них больше Documentey, но я понятия не имею, как запросить массив голосов, чтобы получить документы с наибольшим количеством голосов за последние 24 часа.
Я склоняюсь к второму, так как было бы легче запросить подсчет голосов, сгруппированных по голосу. Думаю, но я не уверен, насколько хорошо он будет действовать. Так вы делаете это в реляционных базах данных, но это не выглядит очень документально, но я не уверен, что это проблема, не так ли?
Или я использую комбинацию из двух? Также я бы сделал этот тип агрегированного запроса в режиме реального времени, при загрузке каждой страницы. Или я просто запускаю запрос один раз в минуту и сохраняю результаты в коллекции результатов запроса?
Как вы бы описали эту схему?
связанный с этим вопрос: http://stackoverflow.com/questions/ 9296793/effective-document-format-to-store-vote-in-mongo-db –
Связано также: http://stackoverflow.com/questions/7046462/best-way-to-model-a-voting-system-in -mongodb – wmassingham