2015-06-13 11 views
9

Bardzo prosty problem projektowy. Powiedz, że chcę zbudować Facebook Messenger. Powiedzmy, że John i Marry rozmawiają na czacie, co jest lepszym podejściem?MongoDB: najlepszy projekt aplikacji do obsługi wiadomości

1) 1 dokument za rozmowy, messages jest tablicą wiadomości obiektu

{ participants: ['john', 'marry'], 
    messages: [ 
     { sender: 'john', content: 'howdy', time_created: new Date() }, 
     { sender: 'marry', content: 'good u', time_created: new Date() }, 
     ... 
    ] 
} 

2) 1 dokument za wiadomość

{ participants: ['john', 'marry'], sender: 'john', message: 'howdy', time_created: new Date() } // document 1 
{ participants: ['john', 'marry'], sender: 'marry', message: 'good u', time_created: new Date() } // document 2 
.... 

Które podejście ma lepsze osiągi pod względem wstawianie nowej wiadomości (aktualizacja rozmowy lub tworzenie nowego dokumentu)?

czy są jakieś lepsze podejście (jak w moim drugim podejściu, nie jestem pewien, czy to dobry projekt, aby określić pole uczestników w każdym dokumencie)?

Dzięki!

Odpowiedz

11

Na podstawie przykładowych danych aplikacji do obsługi wiadomości można zrobić dwie kolekcje: Rozmowa i Wiadomości. Gdzie związek jest jeden Rozmowa ma wiele wiadomości.

Conversation: 
{ id: 123 
    participants: ['john', 'marry'], 
} 


Message: 
{ sender: 'john', 
    content: 'howdy', 
    time_created: new Date(), 
    converstationId: 123 
}, 
{ sender: 'marry', 
    content: 'good u', 
    time_created: new Date(), 
    converstationId: 123 
}, 

Tworzenie nowej wiadomości dokument będzie lepiej w tym przypadku, jak możesz mieć dwie aplikacje (1 dla Jana i 1 dla małżeństwa) bez możliwości obsługi dwóch z nich aktualizowanie tego samego dokumentu. Po prostu dzielą się tą samą sesją konwersacji.

Ponadto, jeśli rozmowa jest pojedynczym dokumentem, może pojawić się bardzo duży dokument. (Obawa wzrost Document)

Możesz dowiedzieć się więcej na temat modelowania danych dla tej MongoDB doc

http://docs.mongodb.org/manual/core/data-modeling-introduction/

także zobaczyć MongoDB: Socialite dla examples/dyskusji o social network przypadek użycia.

Mam nadzieję, że to pomaga. Pozdrawiam.

+0

Czy aktualizowanie 2 kolekcji każdej nowej wiadomości wymagałoby dużo zapisu w bazie danych? –

+0

Zaktualizowałbyś tylko kolekcję wiadomości dla każdej nowej wiadomości. Kolekcja konwersacji jest tworzona/aktualizowana tylko wtedy, gdy pojawią się nowi uczestnicy lub rozpocznie się nowa rozmowa. Twoja aplikacja może zachować identyfikator rozmowy (podobnie jak sesja). –

+0

, ale jeśli nie aktualizujesz kolekcji konwersacji przy każdej nowej wiadomości (w celu zachowania ostatniej zaktualizowanej godziny), w jaki sposób pobierzesz całą rozmowę posortowaną od najnowszej do najmniejszej, kiedy użytkownik otworzy aplikację? –