我创建了一个小型的社交网站,它有三个简单的表格,如下所示。

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

用户可以阻止任何他们想要的人,如果阻止发生,两个用户将不再在他们的新feed上看到彼此的帖子。
从我的表中可以看出user1user2不会看到彼此的帖子,但是'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的post,但是user2仍然看到user1的post,这是我不想要的。对于这种情况,我能做的最好的查询是什么?
还请考虑一下我的数据库设计是不是这样的好办法?你可以建议我,非常感谢:)

最佳答案

我将尝试加入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的帖子,但反之亦然。

关于php - 如何使用mysql数据库创建阻止系统?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32623429/

10-14 15:09