我使用MongoDB + PHP爲不同種類的提要(帖子,照片,投票等)和評論添加「facebookish」新聞源。MongoDB性能:新聞源體系結構,訂閱者,評論
每個進料屬於一些「信道」 - 目前它可能是用戶或組(在將來,可以有更多的容器)。
任何用戶都可以訂閱任何頻道或從其取消訂閱。
現在我們假設有很多渠道和噸飼料。渠道/飼料/評論的最佳結構是什麼?
我正在考慮兩種方法:
1)飼料收集每個飼料中用戶的列表:
feeds:
[
{date_added: ...,
last_update: ...,
title: ...,
text: ...,
channel: ...,
channel_subscribers: [...],
comments_subscribers: [...],
comments: [...]
},
{...},
{...},
{...}
]
如果我想獲得最後提要:
db.feeds.find({date_added: "this week", channel_subscribers: "my_login"});
如果我想得到新的評論的飼料:
db.feeds.find({last_update: "this week", comments_subscribers: "my_login"});
優點:
- 簡單,快速閱讀?
缺點:
- 當我想訂閱/ unsibscribe用於/從一個頻道我要運行 低谷所有飼料和推/從 channel_subscribers列表拉我的名字;它可能是緩慢的,如果我有噸飼料
2)獨立的「渠道」收集: 同樣的事情,但保持用戶的列表渠道收集:
channels:
[
{channel_id:..., last_update: ..., subscribers: [...]},
{channel_id:..., last_update: ..., subscribers: [...]}
]
首先,我要查詢最後更新道:
subscribes = db.channels.find({last_update: "today", subscribers: "my_login"})
現在找到我的供稿:
db.feeds.find({channel: {$in: subscribes}], date_added: "today"})
優點:
- 簡單,快速和更安全訂閱/ unsubsribing;
缺點:
- 我覺得我應該避免$在,因爲它的速度慢,尤其是當我有很多的 訂閱把該運營商內部的(?)。
3)請用戶集合(因此每個用戶都有自己訂閱的陣列)
users:
[
{_id: ..., login: ..., email: ..., subscribes: [...]}
]
缺點用戶訂閱: - 在這種情況下,我們將有更大數組放在$ in之內比以前的(#2)方法。
4)您的建議?
MongoDB建議他們使用的數據結構適合最常見的用例。儘管理解你當前的結構仍然有點困難。你能詳細說明你的結構嗎? – JohnP 2012-01-29 07:04:00
好吧,讓我簡化我的問題。什麼會更快:保留我的訂閱列表,然後把這個大數組放在「$ in」運算符中,並通過它獲取我的提要;或者 - 通過我的登錄名獲取提要 - 每個提要中都有一個大(〜2000)的用戶數組? (在這樣的大陣列上創建多鍵索引是否是一個好習慣?) – oyatek 2012-01-30 08:00:21
我認爲將訂閱者保留在訂閱源中是一個壞主意。可能會更好地鏈接它們。這看起來有點SQLey,但它也易於搜索和刪除。 – JohnP 2012-01-30 08:46:15