【问题标题】:How do i create a blocking system with mysql database?如何使用 mysql 数据库创建阻塞系统?
【发布时间】:2015-09-17 19:53:12
【问题描述】:

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

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

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

从我的表格来看,这意味着 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 的帖子,但 user2 仍然看到 user1 的帖子,这是我不想要的。对于这种情况,我能做的最好的查询是什么? 还请考虑我的数据库设计是这样的好方法吗?你可以建议我,非常感谢:)

【问题讨论】:

    标签: php mysql sql


    【解决方案1】:

    您必须检查block_byblock_to 字段。

    SELECT * FROM Post p 
    WHERE p.user_id NOT IN (
        SELECT b.blocked_to AS userId FROM Block b  
        WHERE b.block_by = {$_SESSION['userid']}
        UNION DISTINCT 
        SELECT b.blocked_by AS userId FROM Block b  
        WHERE b.block_from = {$_SESSION['userid']}
    )
    

    在访问$_SESSION 数组中的字段时,您还应该使用引号($_SESSION['userid'] 而不是$_SESSION[userid])。

    【讨论】:

    • 我试过了,还是不行,user2还能看到user1的帖子。我想我可能会创建两个关系,1 块 2 和 2 块 1,只有我现在能想出的解决方案。
    • @Marcus 我已经更新了我的答案。你能再试一次吗?
    • 是的,它成功了,感谢@mapek 和大家的回答:)
    【解决方案2】:

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

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

    我还会稍微修改您的架构,以在 Block 表中包含 both 关系:

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

    首先,我相信这是表示双向关系的最简单方法。在最坏的情况下,Block 表的大小会翻倍。此外,您不知道在未来的某个时候您是否可能会遇到一种情况,即阻止是一种方式。例如,您可以允许用户 1 阻止用户 2,此时用户 1 仍然可以阅读用户 2 的帖子,但反之则不行。

    【讨论】:

    • 如果用户 1 屏蔽了用户 2,用户 2 应该仍然可以屏蔽用户 1。只有一个关系时,不能保存两个关系
    • 谁说只有一种关系?我的设计允许存在两种关系,或者只存在一种。
    • 如果用户在块表上没有记录怎么办?
    【解决方案3】:

    抱歉 - 我还没有完全考虑到这一点,但我认为您可以在您的用户不在任何一个 Block 列中的情况下使用到 Block 表的连接。但是我认为这意味着每个帖子都会加入块表中的每个合格行 - 因此添加“不同”以避免重复。我不确定优化器是否可以在不进行大规模表扫描的情况下处理这个问题,但这是一个想法,有待讨论。

    select distinct post.id from Post
    left outer join Block on block_by <> $_SESSION['userid']
     and blocked_to <> $_SESSION['userid'];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多