MySQL朋友表双向唯一索引

时间:2015-05-27 18:48:55

标签: php mysql

我的user表格如下:

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

我目前的friends表的数据库设计是:

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发送朋友(身份证号码: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。我的数据库设计中是否存在系统性缺陷,可能导致此问题?

1 个答案:

答案 0 :(得分:1)

如果您只对“两个用户之间存在关系”感兴趣,则可以对用户ID进行排序,使tasks.py为较小的ID,而to_user_id是较大的ID或其他四处走动。

如果您对“谁添加了谁”感兴趣,可以添加两个新列by_user_iduser_1,并使用两个新列执行上述操作。

如果对两个ID进行排序,则只需一个唯一键即可。

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

如果这对您不起作用,您可以尝试使用触发器,检查是否应该输入,但我认为这是一种非常难看的方式,也许您会遇到相同的读写问题表