2012-06-15 88 views
0

我正在開發一個Rails應用程序,該應用程序實現了一些社交網絡功能作爲關係,跟隨等。到目前爲止,一切都很好,直到我遇到了許多關係中的問題。正如你所知道的,mongo缺少連接,所以推薦的解決方法是將關係作爲兩個相關文檔上的id數組存儲。 OK,這是一個有點多餘,但它應該工作,讓我們說:確保MongoDB中所有文檔之間的數據一致性

field :followers, type: Array, default: [] 
field :following, type: Array, default: [] 


def follow!(who) 
    self.followers << who.id 
    who.following << self.id 
    self.save 
    who.save 
end 

這工作得很好,但是這是我們需要一個事務,呃這些情形之一的,但蒙戈不支持事務。如果將id添加到「follow」追隨者列表中,但不添加到「follower」追隨者列表中,該怎麼辦?我的意思是,如果第一個文件被正確修改,但第二個文件由於某種原因不能更新。

也許我太悲觀了,但沒有更好的解決方案?

+0

爲什麼要將它存儲在兩個地方?您可以將其存儲在一箇中,然後查詢以獲取另一個列表。 –

+0

好點,它應該是最乾淨的方式。非常感謝你! – Hardy

回答

0

我建議只在一個方向上存儲關係,將用戶在用戶文檔中關注的用戶存儲爲「跟隨」。然後,如果您需要查詢用戶U1的所有追隨者,則可以查詢{users.following : "U1"}由於您可以在數組上具有多鍵索引,因此如果您索引此字段,此查詢將會很快。

只有朝這個方向發展的另一個原因是單個用戶對他們可能遵循的用戶數量有實際的限制。但是真正受歡迎的用戶可能擁有的關注者數量可能接近系統中的用戶總數。您希望避免在可能很大的文檔中創建數組。

+0

我曾經想過,但我擔心這樣的數組查詢可能會對性能產生影響。但正如你所說,正如我所測試的那樣,如果該字段被索引,則沒有這種差異。所以,現在我要用你的解決方案,一切似乎完美無缺。再一次非常感謝你! – Hardy

相關問題