【问题标题】:Best way to enable blacklists for users为用户启用黑名单的最佳方式
【发布时间】:2012-08-30 03:26:57
【问题描述】:
我想允许我的用户创建内容来源的黑名单(用户/类别/单词/?)。他们应该看不到来自这些来源的任何内容。
例如:如果用户 A 将用户 B 列入黑名单,然后用户 B 上传了一张图片,那么用户 A 请求查看图库他不会看到来自 B 的图片,但他将能够看到来自用户 C 的图片, D、...
当一个用户建立一个大黑名单(例如 100 个来源)时,就会出现问题。那么 SQL 查询将非常长且复杂(“...and author != 'B' and category != 'C'...”)最终会杀死我的服务器。
解决这个问题的其他方法是什么?
【问题讨论】:
标签:
php
mysql
sql
optimization
blacklist
【解决方案1】:
在我看来,您正在使用动态 SQL 来构建此查询。您应该将黑名单存储在与 UserId 相关的表中,然后您可以编写一个使用NOT IN 或NOT EXISTS 的存储过程来构建最终结果集。
【解决方案2】:
首先,在每个可以忽略的列上创建索引。这样,您的匹配条件会更快找到。
然后您可以创建一个中间表来收集用户与他列入黑名单的内容之间的关系。
可能是这样的:
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
)
(我不太确定这里的语法,但我希望你应该明白)
【解决方案3】:
查询可能看起来很复杂,但这并不重要。确保为这些列编制索引,并最好使用类别、作者等数字。
那么你会有一个类似的查询
SELECT * FROM .... WHERE author_id NOT IN (1,12,567,6788) AND category_id NOT IN (6654,23245,89795)