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

时间:2012-09-05 11:59:14

标签: php mysql sql optimization blacklist

我想允许我的用户创建内容源(用户/类别/字/?)的黑名单。他们不应该看到这些来源的任何内容。

例如:如果用户A将用户B列入黑名单,然后用户B上传了一张图片,那么用户A要求查看图库,他将无法看到来自B的图片,但他将能够看到来自用户C的图片, D,......

当一个用户构建一个大黑名单(例如100个源)时会出现问题。然后SQL查询将非常冗长和复杂(“...和作者!='B'和类别!='C'...”)最终会杀死我的服务器。

处理此问题的其他方法有哪些?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

首先,在每个可以忽略的列上创建索引。这样,您的匹配条件会更快一些。

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

也许是这样的:

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
)

(我对这里的语法不太确定,但我希望你能得到这个想法)

答案 2 :(得分:1)

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

那么你会有像

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