概述在我的數據庫中存儲用戶的Facebook朋友列表的最佳方式是什麼?
我創建了一個使用Facebook登錄的Ruby on Rails網站。
對於每個用戶,我都有一個數據庫條目,用於存儲他們的Facebook用戶ID以及其他基本信息。
我還使用了考拉的寶石,以獲取來自Facebook用戶的好友列表,但我不確知我應該如何存儲這些數據...
選項1
我可以在User
表中存儲用戶的朋友作爲序列化哈希,然後如果我想顯示所有當前用戶的朋友列表,我可以抓住這個哈希並按照SELECT FROM Users WHERE facebook_user_id IN hash
用戶登錄我可以更新這個f可以存儲最新的朋友列表。
選項2
我可以在這裏創建一個朋友表和存儲友誼的信息,在用戶有很多朋友。所以每個友誼都會有一排(User1
和User2
列)。然後,顯示當前用戶的好友列表,我可以做類似SELECT User2 FROM Friends WHERE User1 = current_user
這似乎是一個更好的選擇我,但是......
它的缺點是會有很多的行...如果有100,000個用戶,每個用戶有100個朋友,那麼Friends表中現在有10,000,000個行。
這也意味着每次用戶登錄時,我需要遍歷他們的Facebook朋友列表返回使用考拉和創建一個朋友記錄,如果他的朋友列表中有人在我的用戶表中,並沒有一個相應的進入朋友表。這似乎是如果一個用戶有1000個Facebook的朋友會很慢?
我很感激任何指導如何最好的實現這一目標。
對措辭嚴厲的問題表示歉意,我會盡快嘗試重新組織。
感謝您提前提供任何幫助。
感謝您的回答。你是對的,從來沒有這麼多的用戶,我只是想學習最好的方式去做事情。如果我按照您建議的模式行事,每次用戶登錄時,我都需要更新關係表,以便爲自上次訪問以來已註冊到我的網站的任何用戶的朋友創建友誼。這將需要遍歷他們的朋友列表並嘗試在我的數據庫中找到用戶,如果存在,則創建一個新的關係條目(如果尚未存在的話)。這是做事最有效的方式嗎?這看起來效率很低。 – woodstock365
你的目標似乎是減少記錄(根據你在問題中10,000,000行的例子),所以對於每一個關係來說,對於同一關係的每個方向有一個記錄,對於每個方向有一個記錄會有一半的行數(所以會是5000000)。但是,如果您不介意每個關係都有可能重複的行,那對您當前的需求來說似乎是更好的解決方案。 –
另外,你不是(或者至少不應該)在控制器中進行循環以獲得每個朋友。你的查詢和數據庫是(希望)在這方面很好。爲了避免你所指的n + 1個查詢,使用':include'選項來確保AR查詢的時間,它只爲每個模型類型查詢一次查詢。你可以優化這個更多,但在一開始,你可能不需要。 –