2014-06-05 37 views
0

它將成爲一個基於Web的Asychronus,多用戶聊天。 我不確定將所有內容嵌入到一張表中。通道文檔和嵌入式消息作爲子文檔。 或規範化,兩個不同的表,通道和消息,如關係數據庫。在MongoDB中,我應該使用規範化還是嵌入以下情況?

Channel: [ 
    { 
    _id: ObjectId(…), 
    title: '' 
    descr: '' 
    owner: '' 
    mods : [] 
    } 
] 

Message: [ 
    { 
    _id: ObjectId(…) 
     msgid:'' 
     from : 'UserID' 
     msg : '' 
     Channel : "Channel'sObjectID" 

    } 

Channel: [ 
    { 
    _id: ObjectId(…), 
    title: '' 
    descr: '' 
    owner: '' 
    mods : ['UserID','UserID',] 

    Message: [ 
     { 
      msgid:'' 
      from : 'UserID' 
      msg : '' 

     } 

    } 
] 

消息是聊天消息,並需要寫很多(如插入多因多用戶requriement)。所以如果我想寫我需要查詢下來頻道的消息,並寫在那裏。它會達到更多的性能嗎?

回答

1

隨着時間的推移,當每個通道獲得越來越多的消息時,應該將各個消息作爲單獨的文檔放入另一個集合中。

原因是MongoDB不喜歡隨着時間的推移而增長的文檔。出於性能原因,MongoDB將每個文檔保存在物理文件的連續部分中。當文檔增長到超過該部分時,它需要被移動到文件中的另一個位置。這種不斷重新分配可能是一個真正的性能掛鉤。非常大的對象也不利於緩存。爲了進一步阻止增長的對象,MongoDB對每個文檔施加了16MB的人爲大小限制。在大約3個月內,每分鐘100個字節的平均聊天活動的聊天頻道將超過此限制。

+0

哦,16MB每個文件是否包含嵌入式文檔?如果嵌入式文檔增長,它也會打擊主文檔嗎?有了多用戶env,它會在幾天內輕易超過。我認爲嵌入式文檔被視爲分離的文檔。非常感謝! –

+0

@ V3ss0n是的,嵌入式文檔是嵌入文檔的一部分。 – Philipp

相關問題