2012-06-27 19 views
12

Mesaj uygulamasının işlenmesi için iyi bir belge yapısı hakkında düşünmeyi düşünüyorum. (farklı kişiler veya kişileri grupları içeren)MongoDB Mesaj uygulaması için Yapı

  1. kullanıcı (kullanıcı adı, e-posta, şifre vb)
  2. kişiler listesi:

    Temelde nesnelerin üç (veya dört) türleri gerek

  3. konuşma
  4. mesajı (mesaj gövdesi, bazı zaman damgası ve yaratıcısı içerir.) (a konuşma bazı kişiler arasında mesajların bir koleksiyon)

Benim fikrim kullanıcı belgeye kişileri gömmek için ve bir konuşma belgede mesajları gömmek oldu:

1. Kullanıcı

{ 
    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. Konuşma

{ 
    members: [ user_id1, user_id2 ], 
    messages: [ 
     { author: user_2, body: 'Hi what's 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' } 
    ] 
} 

Bu şema hakkında ne düşünüyorsunuz?

Her belgenin farklı güncelleme sıklığı olduğu için, bunların ayrılmasının daha iyi olacağına inanıyorum (böylece her belge kendi başına). o

Selamlar

+2

bir MongoDB şema görünüyor kendi başına “kötü”, “iyi” ya da. Yapacağınız sorguları ve güncellemeleri detaylandırmanız gerekiyor. Ancak o zaman verilen bir şemanın bu operasyon modellerine uygun olup olmadığını değerlendirebilirsiniz. –

+1

Ayrıca, veri boyutlarının dağılımını da tahmin etmelisiniz, ör .: sohbetin ortalama olarak maksimum kaç mesaj içereceği? Gömmek istiyorsanız bu önemli olabilir. –

+0

Tamam, bunu aklımda tutacağım. Örneğin, redis ile mesajları önbelleğe almak ve oturum bittiğinde hepsini mongo'ya kaydetmek daha yaygın bir yaklaşım mıdır? "Yapılandırılmamış" bir nesneye çok fazla yazma eylemi gerçekleştirme konusunda biraz emin değilim. –

cevap

4

Sorunuz gerçekten şema tasarımı biridir :) bazı tavsiyelerde duymak güzel olurdu böylece Ama gerçekten bu konuda hiç deneyimim yok. Seçimler ve alım satımlar hakkında bilgi edinmek için MongoDB şema tasarımında bu sayfaya bir göz atmanızı öneriyorum: http://www.mongodb.org/display/DOCS/Schema+Design

Ayrıca, muhtemelen bu belgenin 'Ayrıca Bakınız' bölümündeki bağlantıları da gözden geçirmelisiniz. Özellikle video sunumlarını tavsiye ederim. http://docs.mongodb.org/manual/use-cases/storing-comments/

7

Bu soru olduğunu görüyoruz:

Son olarak, muhtemelen bir mesajlaşma için üç olası şemalar bir tartışma/her tasarım için dengeler dahil veritabanı yorumlama için bu belgenin bir göz atmalısınız eski, ama ilgilenen herkes için, benzer bir soru istendi ve bir cevap değildir yaşayabilir https://stackoverflow.com/a/30830429/132610

Conversation : { 
id: 123, 
members: [ user_id1, user_id2 ] 
} 
Message { conversationId: 123, author: user_2, body: 'Hi what's up' } 
Message { conversationId: 123, author: user_1, body: 'Whanna ask some question on stackoverflow' } 
+0

Aklımda bir karışıklık var, siz (ve herkes) "Konuşmalar" için bir koleksiyon ve "Mesajlar" için başka bir Koleksiyon.mesajlaşmada 1 milyon kullanıcımız olduğunu ve birbirleriyle konuştuğunu, “Mesajlar” tablosunun milyarlarca milyar belgeye ulaşabileceğini, mongodb'un bu büyük belge koleksiyonunu yönetebilme yeteneğine sahip olduğunu ve arama yanıt süresi hakkında ne diyeceğini varsayalım. son 100 iletiyi milyarlarca milyar iletide tek bir kullanıcı için geri gelmenin ne kadar zaman alacağını söyleyelim mi? –