我正在Rails的一个社交网站上工作,目前我可以想到几种实现友谊的方式(就像Facebook)。但是,由于许多应用程序的功能将取决于应用程序的这一部分,因此我对提交一个文件感到有些担忧,然后意识到自己可以做得更好,然后进行迁移并更改整个一件事一件事。
如果你们可以建议哪一种是最好的方法,那将是很棒的。另外,如果我的架构都不够好,请随时提出一个新的架构
建筑1
一张包含3列的用于友谊的表格-
得到用户的所有 friend
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
两张桌子。一个用于友谊,另一个用于 friend 的请求-
友谊会像-
Friend Requests表也将像-
要获得用户的所有 friend -
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个条目有多糟糕? (架构2)
最佳答案
我会推荐第二种模型,即friend_request
和friendship
的单独表。尽管这些表当前可能保存完全相同的数据,但随着时间的推移,我希望它们会有所不同。
以下是一些可能发生这种情况的方式:-
因为它们是不同的东西,所以您应该创建不同的表,而不是重载单个表。创建表并不难。
您是否应该在表格中放置两行,分别代表关系的两个方向?这是归一化与性能的问题。
归一化的答案是仅包括一行。该模型:
归一化的答案(因为存储了重复的数据)将包括两行:此模型: