为用户启用黑名单的最佳方式


Best way to enable blacklists for users

我想允许我的用户创建内容源的黑名单(users/categories/words/?)。他们不应该能够看到来自这些来源的任何内容。

例如:如果用户A将用户B列入黑名单,然后用户B上传了一张图片,那么用户A请求查看图库,他不会看到来自B的图片,但他可以看到来自用户C、D。。。

当一个用户建立了一个大黑名单(例如100个来源)时,就会出现问题。然后SQL查询将非常长和复杂("…和author!='B'和category!='C'…"),这将最终杀死我的服务器。

处理这个问题的其他方法是什么?

在我看来,您正在使用动态SQL来构建此查询。您应该将黑名单存储在与UserId相关的表中,然后可以编写一个使用NOT INNOT EXISTS构建最终结果集的存储过程。

首先,在每个可以忽略的列上创建索引。这样,您的匹配标准会更快地找到。

然后,您可以创建一个中间表,收集用户和他列入黑名单的内容之间的关系。

也许是这样的:

userId | blacklistType | blacklistId
1      | user          | 2
1      | category      | 12
1      | word          | 4

现在,如果您想要用户1的所有类别,您可以使查询

SELECT *
FROM categories
WHERE NOT EXISTS (
    SELECT userId
    FROM blacklist
    WHERE userId = 1
        AND blacklist.blacklistType = 'category'
        AND categories.id = blacklist.blacklistId
)

(我不太确定这里的语法,但我希望你应该了解这个想法)

查询看起来可能很复杂,但这并不重要。确保对这些列进行索引,最好使用类别、作者等的数字。

那么你会有一个类似的查询

SELECT * FROM .... WHERE author_id NOT IN (1,12,567,6788) AND category_id NOT IN (6654,23245,89795)