【问题标题】:What is the most efficient method of keeping track of each user's "blocked users" in a MySQL Database?在 MySQL 数据库中跟踪每个用户的“被阻止用户”的最有效方法是什么?
【发布时间】:2011-03-26 11:58:10
【问题描述】:

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

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

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

有没有更好的方法(我确定有!)?如果是这样,为什么它会更好?您的建议的优缺点是什么?

谢谢,非常感谢!

【问题讨论】:

  • +1 用于清晰的描述,使用示例。

标签: mysql


【解决方案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. 您将拥有正确的数据模型 你的块关系
    • 使用外键,您将保持数据模型的一致性

这种方法的缺点:

  1. 在你的情况下,我看不到任何东西

你的方法的缺点:

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

【讨论】:

    【解决方案2】:

    您正在寻找交叉引用表。

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

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

    【讨论】:

      【解决方案3】:

      您正在寻找以多对多关系连接的第二个表。查看此帖子:
      Many-to-Many Relationships in MySQL

      “优点”很多。您正在以参照完整性处理您的数据,这在未来具有不可估量的好处。您描述的问题将在您的应用程序中被其他人关注,其中一些其他人将比这个更难以管理。

      “缺点”是

      1. 您必须了解参考数据的工作原理(但正如我所说,这无论如何都在前面)
      2. 您将需要处理更多表(同上)
      3. 您必须了解更多有关 CRUD 的信息,这很困难……但是,这只是软件包的一部分。

      【讨论】:

        【解决方案4】:

        您当前使用的方法不被视为关系数据库设计的良好做法,但是,与其他任何方法一样,在某些情况下,这种方法是合理的,尽管在您可以完成的工作方面受到限制。

        您可以做的是,就像 J V 建议的那样,创建一个包含用户关系映射的交叉引用表。除其他外,这使您可以跳过不必要的查询,利用表索引,而且可能最重要的是,它在未来为您提供了更大的灵活性。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-19
          • 2023-03-23
          • 2023-04-10
          • 1970-01-01
          • 1970-01-01
          • 2016-09-02
          • 2012-10-15
          相关资源
          最近更新 更多