我想允许我的用户创建内容源的黑名单(users/categories/words/?)。他们不应该能够看到来自这些来源的任何内容。
例如:如果用户A将用户B列入黑名单,然后用户B上传了一张图片,那么用户A请求查看图库,他不会看到来自B的图片,但他可以看到来自用户C、D。。。
当一个用户建立了一个大黑名单(例如100个来源)时,就会出现问题。然后SQL查询将非常长和复杂("…和author!='B'和category!='C'…"),这将最终杀死我的服务器。
处理这个问题的其他方法是什么?
在我看来,您正在使用动态SQL来构建此查询。您应该将黑名单存储在与UserId相关的表中,然后可以编写一个使用NOT IN
或NOT 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)