Возьмите систему личных сообщений Facebook, где вы должны отслеживать отправителя и получателя вместе с содержимым сообщения. Если бы я использовал MySQL, у меня было бы несколько таблиц, но с MongoDB я постараюсь избежать всего этого. Я пытаюсь придумать «хорошую» схему, которая может масштабироваться и проста в обслуживании. Если бы я использовал mysql, у меня была бы отдельная таблица для ссылки на пользователя и сообщение. Смотри ниже ...
таблица профилей
user_id
first_name
last_name
таблица сообщений
message_id
message_body
time_stamp
user_message_ref table
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>
}
]
}
Таким образом, я могу запрашивать сообщения с участием «Bob» и проходить через массив «user_msgs». Я смогу сказать, кто является отправителем, и отсортировать по отметке времени.