小编典典

如何使用mysql数据库创建阻止系统?

sql

我创建了一个社交网站,其中包含三个简单的表格,如下所示。

Table User
id (pk)  | user_name
1       | a
2       | b
3       | c

Table Post
id (pk)  | user_id (fk)
1       | 1
2       | 3
3       | 2
4       | 2

Table Block
id (pk) | block_by (fk)  | blocked_to (fk)
1       | 1              | 2

用户可以阻止任何他们想要的人,并且如果发生阻止,两个用户将不再在他们的新供稿中看到彼此的帖子。

在我的表中,这意味着user1并且user2不会看到彼此的帖子,但是“ user3”通常会看到每个人的帖子,因为他不属于该表格块。

    select * from Post p 
where p.user_id not in 
(select b.blocked_to from Block b  
where b.block_by = '$_SESSION[userid]')

从SQL查询中user1无法看到user2的帖子, 但是user2仍然可以看到user1的帖子,
这是我不想要的。我可以针对这种情况的最佳查询是什么?还请考虑我的数据库设计是这条好路吗?您可以建议我,非常感谢:)


阅读 229

收藏
2021-04-28

共1个答案

小编典典

我将尝试加入PostBlock表,以过滤出属于其他潜在被阻止用户的给定用户(您通过会话获得)所请求的帖子:

SELECT * FROM Post p INNER JOIN Block b
ON p.user_id = b.blocked_by
WHERE b.blocked_to <> '$_SESSION[userid]'

我还将略微修改您的架构以在表中包括 两个 关系Block

+---------+---------------+-----------------+
| id (pk) | block_by (fk) | blocked_to (fk) |
+---------+---------------+-----------------+
|   1     |      1        |       2         |
|   2     |      2        |       1         |
+---------+---------------+-----------------+

首先,我认为这是代表双向关系的最简单方法。在最坏的情况下,Block表的大小将增加一倍。此外,您不知道将来是否会遇到以块为一种方式的情况。例如,您可以允许用户1阻止用户2,其中用户1仍可以阅读用户2的帖子,反之亦然。

2021-04-28