我的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_id
和by_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
。我的数据库设计中是否存在系统性缺陷,可能导致此问题?
答案 0 :(得分:1)
如果您只对“两个用户之间存在关系”感兴趣,则可以对用户ID进行排序,使tasks.py
为较小的ID,而to_user_id
是较大的ID或其他四处走动。
如果您对“谁添加了谁”感兴趣,可以添加两个新列by_user_id
和user_1
,并使用两个新列执行上述操作。
如果对两个ID进行排序,则只需一个唯一键即可。
您可以使用MySQL函数GREATEST()
和LEAST()
来简化插入查询。
如果这对您不起作用,您可以尝试使用触发器,检查是否应该输入,但我认为这是一种非常难看的方式,也许您会遇到相同的读写问题表