我不太确定该如何表述,但是有没有很好的方法来实现一个表,这些表的列基本上是可互换的?
示例:您有一个用户模型,并希望允许两个用户成为“ friend ”。对我来说,最明显的方法是有一个包含两列的表(“friend1”和“friend2”),每列都包含一个用户 key 。这使得说诸如“是user1和user2的 friend ”之类的语句很尴尬,因为您必须检查“(friend1 = user1 AND friend 2 = user2)OR(friend1 = user2 AND friend 2 = user1)”。可以,但是对我来说似乎很尴尬,每当您想从该表中获取某些信息时,您都会在这两列中查找。有没有更优雅的方法呢?
最佳答案
建立友谊关系时的一个关键选择是确定它是否是双向的。 Twitter以下是一个单向友谊的示例,而Facebook友谊则是双向的。听起来您像是致力于双向的,所以您有两个选择:
1)检查两个方向
select *
from friendships
where (friend1 = 123 and friend2 = 456) OR (friend2 = 123 and friend1 = 456)
2)始终将较低的user_id放入friend1,将较高的user_id放入friend2,然后您的测试仅需要检查一个方向。维护起来有点棘手,所以出于性能方面的考虑,我只需要这样做。