我创建了一个社交网站,其中包含三个简单的表格,如下所示。
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”通常会看到每个人的帖子,因为他不属于该表格块。
user1
user2
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的帖子, 这是我不想要的。我可以针对这种情况的最佳查询是什么?还请考虑我的数据库设计是这条好路吗?您可以建议我,非常感谢:)
我将尝试加入Post和Block表,以过滤出属于其他潜在被阻止用户的给定用户(您通过会话获得)所请求的帖子:
Post
Block
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的帖子,反之亦然。