[英]Best database architecture for friendships in a social networking application
我正在Rails的社交網站上工作,目前我可以想到幾種方式可以實現友誼(就像Facebook一樣)。 但是由於很多應用程序的功能將取決於應用程序的這一部分,我有點擔心提交到一個,然后意識到我可以做得更好,然后進行遷移並改變整個事情一個接一個。
如果你們可以建議哪種方式最好,那就太好了。 此外,如果我的架構都不夠好,請隨意建議一個新架構
建築1
友誼的單個表有3列 -
獲得用戶的所有朋友
def friends
user_ids = Friendship.where(
'(user_id = :id OR friend_id = :id) AND pending = false',
id: self.id
).pluck(:user_id, :friend_id)
.flatten
.uniq
.reject { |id| id == self.id }
users = User.where(id: user_ids)
end
要獲得用戶收到的所有好友請求 -
def friend_requests
friend_ids = Friendship.where('friend_id = ? AND pending = true', self.id).all
users = User.where(id: friend_ids)
end
我能想到的優點 -
我能想到的缺點 -
建築2
兩張桌子。 一個用於友誼,一個用於朋友請求 - 友誼將像 -
朋友請求表也會像 -
獲得用戶的所有朋友 -
has_many :friendships,
class_name: "Friendship",
foreign_key: :user_id,
primary_key: :id
has_many :friends,
through: :friendships,
source: :friend
要獲得用戶的所有朋友請求 -
has_many :friend_requests,
class_name: "FriendRequest",
foreign_key: :friend_id,
primary_key: :id
我能想到的優點是 -
我能想到的缺點是 -
| id | user_id | friend_id |
-----------------------------
| 1 | 15 | 30 |
-----------------------------
| 2 | 30 | 15 |
-----------------------------
我想最后這個問題歸結為 -
數據庫(體系結構1)中具有較少數量(一半)的條目與更多條目(體系結構2)相比具有顯着優勢嗎?
和
單個友誼有兩個條目有多糟糕? (建築2)
我會推薦第二個模型,為friend_request
和friendship
分開表。 雖然這些表目前可能保存完全相同的數據,但隨着時間的推移,我預計它們會分歧。
以下是可能發生的一些方法: -
因為它們是不同的東西,所以應該創建不同的表而不是重載單個表。 創建表格並不困難。
你應該在表中放兩行,代表關系的兩個方向嗎? 這是規范化與績效的問題。
規范化答案僅包括一行。 這個型號:
反規范化答案(因為存儲了重復數據)是包括兩行:此模型:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.