Структура MongoDB для приложения сообщений
Я разбиваю себе голову, думая о хорошей структуре документа для обработки приложения сообщений.
Мне в основном нужны три (или четыре) типа объектов:
- Пользователь (имя пользователя, адрес электронной почты, пароль и т.д.)
- Список контактов (содержащих разные контакты или группы контактов)
- Разговор (беседа представляет собой сборник сообщений между некоторыми лицами)
- Сообщение (содержит тело сообщения, некоторую метку времени и создатель.)
Моя идея заключалась в том, чтобы вставлять контакты в пользовательский документ и вставлять сообщения в документ разговора:
1. Пользователь
{
username: 'dev.puS',
usernameCanonical: 'dev.pus', // used for unique constraints
email: '[email protected],
emailCanonical: '[email protected],
salt: 'some hash',
password: 'hash with salt',
logs: { last_login: 12.06.2008, last_password_reset: 04.03.2007 },
state: { online: true, available: false },
contacts: [ user_id1, user_id2, user_id3 ]
}
2. Разговор
{
members: [ user_id1, user_id2 ],
messages: [
{ author: user_2, body: 'Hi what up' },
{ author: user_1, body: 'Nothing out here :(' },
{ author: user_2, body: 'Whanna ask some question on stackoverflow' },
{ author: user_1, body: 'Okay, lets go' }
]
}
Что вы думаете об этой схеме?
Я думаю, что было бы лучше держать их в отдельности (так что каждый документ для него сам), потому что каждый документ имеет другую частоту обновления. Но у меня действительно нет никакого опыта в этом, поэтому было бы хорошо услышать некоторые советы:)
Привет
Ответы
Ответ 1
Я вижу, что этот вопрос старый, но для всех, кто заинтересовался, был задан похожий вопрос, и один ответ выглядит жизнеспособным fooobar.com/questions/438842/...
Conversation : {
id: 123,
members: [ user_id1, user_id2 ]
}
Message { conversationId: 123, author: user_2, body: 'Hi what up' }
Message { conversationId: 123, author: user_1, body: 'Whanna ask some question on stackoverflow' }
Обновление № 1
1) Масштабируемость: MongoDB хорошо масштабируется с очень большой коллекцией. Миллиарды сообщений в коллекции. Существует метод, называемый шардингом, который позволяет разделить большую коллекцию на несколько узлов.
2) Чтение. Так как MongoDB имеет механизмы индексации, чтение сопоставимо с любым точно настроенным ядром базы данных. Таким образом, чтение не будет проблемой. Особенно, когда в беседе (группе | комнате) меньше участников, например, два человека обмениваются сообщениями друг с другом.
Ответ 2
Ваш вопрос действительно относится к дизайну схемы. Я предлагаю взглянуть на эту страницу по дизайну схемы MongoDB, чтобы понять выбор и компромиссы: http://www.mongodb.org/display/DOCS/Schema+Design
Кроме того, вам, вероятно, следует просмотреть ссылки в разделе "См. также" этого документа. Я особенно рекомендую видео презентации.
Наконец, вы, вероятно, должны взглянуть на этот документ для обсуждения трех возможных схем для базы данных сообщений/комментариев, включая компромиссы для каждого дизайна: http://docs.mongodb.org/manual/use-cases/storing-comments/
Ответ 3
Пожалуйста, найдите мое предложение:
Person : {
person_id: '123',
last_login: 12.06.2008,
online: true
}
Conversation : {
conversation_id: append the greater person_id to the lower person_id, // person_1_id =123 and person_2_id =124 then its 123124
messages: [
{ message_id: 1,
message_text : 'Hi what up',
sender_id : 123,
receiver_id: 124,
timestamp : 12344567891
},
{ message_id: 2,
message_text : 'fine',
sender_id : 124,
receiver_id: 123,
timestamp : 12344567891
}
]
}
Ответ 4
это мое предложение
{
"_id" : ObjectId("5a9e9581a2147c0c0f00002e"),
"id_members1" : "5a9e9581a2147c0c0f02345t",
"id_members2" : "5a9e9581a2147c0c0f02134g",
"name" : [
"Omar",
"Mohamed"
],
"messages" : [
{
"author" : "Omar",
"body" : "salam 3likom",
"create_at" : ISODate("2018-03-07T09:04:04.000Z")
},
{
"author" : "Mohamed",
"body" : "Wa3likom salam",
"create_at" : ISODate("2018-03-07T09:04:04.000Z")
},
{
"author" : "Mohamed",
"body" : "wach teshak",
"create_at" : ISODate("2018-03-07T09:04:04.000Z")
},
{
"author" : [
"Omar",
"Mohamed"
],
"body" : "test msg",
"create_at" : ISODate("2018-03-25T15:30:05.000Z")
}
],
"comments" : [
null,
{
"author" : [
"Omar",
"Mohamed"
],
"body" : "test msg",
"create_at" : ISODate("2018-03-25T15:28:11.000Z")
},
{
"author" : [
"Omar",
"Mohamed"
],
"body" : "test msg",
"create_at" : ISODate("2018-03-25T15:28:31.000Z")
}
]
}