我正在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个条目有多糟糕? (建筑2)
答案 0 :(得分:3)
我会推荐第二个模型,friend_request
和friendship
的单独表格。虽然这些表目前可能保存完全相同的数据,但随着时间的推移,我预计它们会分歧。
以下是可能发生的一些方法: -
因为它们是不同的东西,所以应该创建不同的表而不是重载单个表。创建表格并不困难。
你应该在表格中放两行,代表两种关系的方向吗?这是规范化与性能的问题。
规范化答案只包含一行。这个模型:
反规范化答案(因为存储了重复数据)是包括两行:此模型: