在评论中,您基本上声明已建立的友谊(而不是请求)在您的设置中始终是对称的。在这种情况下,您基本上有两个选择:您可以将其存储在两行中,或者通过匹配任一列来选择它。前者将产生更简单的查询,但后者将确保对称性是数据库结构中固有的,并且还将避免存储重复数据。所以我会选择后者,即某种形式的WHERE (User1 = XX or User2 = XX )
. 查询所花费的时间可能是仅查询一列所占用的相同行数的两倍,但由于行数仅为其他存储方案的一半,因此在性能方面的净影响应该可以忽略不计.
您是否需要单独的请求表或已建立的友谊取决于这两者的相似程度,无论是在关联数据方面还是在应用程序中的控制流方面。因此,例如,如果您想向用户显示一个列表,该列表同时显示他已建立的友谊和他的未决请求,可能有不同的颜色或其他,但在同一个列表中,那么在数据库中拥有一个表会更多适当。另一方面,如果您主要将请求和友谊分开处理,那么拥有两张桌子会更自然。而且,如果在某个时候,您决定友谊需要类似的属性,share_calendar
而请求需要类似confirmation_key
或其他的属性,那么使用不同的表会更好。
如果您决定将其设为单个表,我建议为枚举提供更多描述性值,例如调用列status
和值requested
和established
. 例如,我乍一看会将值解释request = 1
为“这只是一个请求,而不是既定的友谊”,这与您所联想的含义完全相反。当不同的人需要维护代码时,这种模糊性可能会导致错误。几年后,你将成为一个与现在不同的人,甚至你自己也可能会误解你的旧代码。所以要在那里描述。
还有一点需要注意:您可能总是使用视图来调整数据库在查询中的显示方式。例如,您可以创建一个视图
CREATE VIEW SymmetricEstablishedFriends AS
SELECT User1 AS Me, User2 AS Friend, Time
FROM Friends
WHERE Status = 'established'
UNION
SELECT User2 AS Me, User1 AS Friend, Time
FROM Friends
WHERE Status = 'established'
This will restrict the data to established friendships only, and will take care of symmetrizing things for you. Using such views in your queries, you can avoid having to deal with all the details of the table structure in every query. And if you ever change those details, there will be less places to change.