启用用户黑名单的最佳方法

4
我希望允许我的用户创建内容源的黑名单(用户/类别/单词/?)。他们不应该能够看到这些来源的任何内容。
例如:如果用户A将用户B列入黑名单,然后用户B上传了一张图片,那么当用户A请求查看画廊时,他将不能看到来自B的图片,但他仍然可以看到来自用户C、D等人的图片。
问题在于,当一个用户建立了一个大的黑名单(例如100个来源)时,SQL查询将变得非常长和复杂(“……并且作者!=‘B’并且类别!=‘C’……”),最终可能会导致服务器崩溃。
有哪些其他方法来处理这个问题?
3个回答

1

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


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
)

我对这里的语法不是很确定,但希望你能理解我的意思。


1

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

然后你会得到一个像这样的查询

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接