在MySQL数据库中跟踪每个用户的“被阻止用户”的最有效方法是什么?

时间:2011-03-26 11:58:11

标签: mysql

管理每个用户的被阻止用户的最有效方法是什么,因此它们不会出现在PHP / MySQL运行的网站上的搜索结果中?

这就是我目前的做法,我觉得这不是最有效的方式:

为主用户表上的每个用户创建一个BLOB,使用他们阻止的每个用户的唯一用户ID进行更新。因此,如果用户ID 313,363和732被用户阻止,则他们的BLOB只包含“313,563,732”。然后,每当查询该用户的搜索结果时,我都会包含BLOB内容,如“AND UserID NOT IN(313,563,732)”,以便阻止的用户ID不会显示给该用户。当用户“解锁”某人时,我会从他们的BLOB中删除该用户ID。

有更好的方法吗(我确定有!)?如果是这样,为什么它更好,你的建议的利弊是什么?

谢谢,我很感激!

4 个答案:

答案 0 :(得分:1)

您正在寻找交叉参考表。

您有一个包含用户ID和“已阻止”用户ID的表,然后是SELECT blockid FROM blocked WHERE uid=$user,并且您有一个被阻止的用户ID列表,您可以通过where子句(例如{{1})进行过滤}

现在,您可以使用实际数据库的所有速度阻止每个用户的多个用户,反之亦然。

答案 1 :(得分:1)

您正在寻找以多对多关系加入的第二张桌子。查看这篇文章:
Many-to-Many Relationships in MySQL

“优点”众多。您使用参照完整性处理您的数据,这将带来无法估量的好处。您描述的问题将由您的应用程序中的其他人遵循,其他一些将比这一个更难以管理。

“缺点”就是那个

  1. 您将不得不了解参考数据的工作原理(但正如我所说的那样,无论如何都是如此)
  2. 您将有更多桌子要处理(同上)
  3. 您将需要了解有关CRUD的更多信息,这很难......但是,只是该软件包的一部分。

答案 2 :(得分:1)

您正在以不理解的方式在关系数据库中保存关系。你不会受到外键等的好处。

我建议的方法是为被阻止的用户提供一个单独的表格:

create table user_blocked_users (user_id int, blocked_user_id);

然后,当您想要过滤搜索结果时,您只需使用子查询:

select * from user u where ?searcherId not in (select b.blocked_user_id from user_blocked_users where b.user_id = u.id)

您可能希望以这种方式开始,然后在需要时使用查询,缓存或其他内容对其进行优化 - 但最后要做到这一点。首先,做一个可以使用的一致且正确的数据模型。

这种方法的一些优点:

  1. 您将拥有正确的数据模型 您的区块关系
    • 使用外键,您将保持数据模型的一致性
  2. 这种方法的缺点:

    1. 在你的情况下,没有我能看到的
    2. 你的方法的缺点:

      1. 它会很慢而且不可扩展,因为blob是二进制搜索而不是索引
      2. 您的数据模型难以维护,您将无法获得外键的好处

答案 3 :(得分:0)

您目前使用的内容并不被视为关系数据库设计的良好实践,但是,与其他任何内容一样,有时可以证明该方法是合理的,尽管在您可以完成的任务方面具有限制性。

您可以做的是,像J V建议的那样,创建一个包含用户关系映射的交叉引用表。这使您可以跳过不必要的查询,使用表索引,最重要的是,它可以为您提供更大的灵活性。

例如,您可以向表中添加一个字段,指示关系的类型/状态(即阻止,朋友,待批准等),这将允许轻松开发更复杂的系统。