Возьмите систему личных сообщений facebook, где вам нужно отслеживать отправителя и получателя по содержимому сообщения. Если бы я использовал MySQL, у меня было бы несколько таблиц, но с MongoDB я постараюсь избежать всего этого. Я пытаюсь придумать "хорошую" схему, которая может масштабироваться и прост в обслуживании. Если бы я использовал mysql, у меня была бы отдельная таблица для ссылки на пользователя и сообщение. См. Ниже...
таблица профилей
user_id
first_name
last_name
таблица сообщений
message_id
message_body
time_stamp
user_message_ref таблица
user_id (FK)
message_id (FK)
is_sender (boolean)
В приведенной выше схеме я могу запросить любые сообщения, которые могут иметь "Боб", независимо от того, является ли он получателем или отправителем.
Теперь как превратить это в схему, которая работает с MongoDB. Я думаю, у меня будет отдельная коллекция для хранения сообщений. Проблема в том, как я могу различать отправителя и получателя? Если Боб регистрируется, что я запрашиваю? В зависимости от того, инициировал ли Боб письмо по электронной почте, я не хочу запрашивать запрос "отправитель" и "получатель", чтобы узнать, принадлежит ли это сообщение пользователю.
Я попал в группу сообщений MongoDB и ушел с чем-то, что может сработать. Каждое сообщение будет рассматриваться как "блог". Когда создается сообщение, добавьте двух пользователей (неважно, кто отправитель/получатель изначально) в массив. Каждый ответ после этого будет рассматриваться как комментарий, который будет вставлен в массив.
СООБЩЕНИЯ
{
"_id" : <objectID>,
"users" : ["bob", "amy"],
"user_msgs" :
[
{
"is_sender" : "bob",
"msg_body" : "Hi Amy, how are you?!",
"timestamp" : <generated by Mongo>
}
{
"is_sender" : "amy",
"msg_body" : "Bob, long time no see, how is the family?!",
"timestamp" : <generated by Mongo>
}
]
}
Таким образом, я могу запросить сообщения, содержащие "Боб", и пропустить через массив "user_msgs". Я смогу рассказать, кто отправитель, и сортировать по метке времени.