MySQL友表双向唯一索引


MySQL Friend Table Two-Way Unique Index

我的user表如下:

Table: users
UserID      Username
1            'Tom'
2            'x1x'
3            'Google'

和我的friends表当前的DB设计是:

Table: user_relationships
relationship_id    to_user_id     by_user_id    status   date
1                     1              2             1     CURDATE()
2                     1              3             2     CURDATE()
3                     3              2             3     CURDATE()

状态栏为:

1 - Friends
2 - Pending Request
3 - Ignored

日期列的目的是查找用户A和用户B成为朋友的时间。问题是,当Tom(id: 1)与x1x (id: 2)成为好友时,Tom不应该向x1x (id: 2)发送好友请求。同样,Tom(id: 1)不应该向Google(id: 3)发送好友(而应该给出一个接受的选项)。我对to_user_idby_user_id设置了唯一约束,但唯一约束不是双向的,如:

Table: user_relationships
relationship_id    to_user_id     by_user_id    status   date
1                     1              2             1     CURDATE()
2                     1              3             2     CURDATE()
3                     3              2             3     CURDATE()
4                     2              1             2     CURDATE()

关系ID 4不应该被允许,查询应该类似于

INSERT INTO ... ON DUPLICATE KEY UPDATE relationship_id = relationship_id

但是,唯一约束不是双向的。我怎样才能做到这一点呢?我真的不想做

SELECT .... WHERE to_user_id = x AND by_user_id = y OR to_user_id = y AND by_user_id = x

检查是否存在,然后基于此检查INSERT。是否有一个系统的缺陷在我的数据库设计,这可能会导致这个问题?

如果您只对"两个用户之间存在关系"感兴趣,您可以对用户ID进行排序,以便to_user_id是较小的ID,而by_user_id是较大的ID,或者相反。

如果您对"谁添加了谁"感兴趣,您可以添加两个新列user_1user_2,并使用这两个新列执行我上面描述的操作。

如果两个id是排序的,那么一个唯一键就可以满足您的要求。

你可以使用MySQL函数GREATEST()LEAST()来简化你的插入查询。

如果这对你不起作用,你可以尝试使用触发器,检查是否应该输入,但我认为这是一个非常丑陋的方式,也许你会从同一个表中读取和写入问题。