Подтвердить что ты не робот

Структура 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' }
    ]
}

Что вы думаете об этой схеме?

Я думаю, что было бы лучше держать их в отдельности (так что каждый документ для него сам), потому что каждый документ имеет другую частоту обновления. Но у меня действительно нет никакого опыта в этом, поэтому было бы хорошо услышать некоторые советы:)

Привет

4b9b3361

Ответ 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")
    }
]

}