我的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_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
。是否有一个系统的缺陷在我的数据库设计,这可能会导致这个问题?
如果您只对"两个用户之间存在关系"感兴趣,您可以对用户ID进行排序,以便to_user_id
是较小的ID,而by_user_id
是较大的ID,或者相反。
如果您对"谁添加了谁"感兴趣,您可以添加两个新列user_1
和user_2
,并使用这两个新列执行我上面描述的操作。
如果两个id是排序的,那么一个唯一键就可以满足您的要求。
你可以使用MySQL函数GREATEST()
和LEAST()
来简化你的插入查询。
如果这对你不起作用,你可以尝试使用触发器,检查是否应该输入,但我认为这是一个非常丑陋的方式,也许你会从同一个表中读取和写入问题。