4

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

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

当一个用户建立一个大的黑名单(例如 100 个来源)时,就会出现问题。那么 SQL 查询将非常长且复杂(“...and author != 'B' and category != 'C'...”)最终会杀死我的服务器。

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

4

3 回答 3

1

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

于 2012-09-05T12:07:09.690 回答
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
)

(我不太确定这里的语法,但我希望你应该明白)

于 2012-09-05T12:09:34.133 回答
1

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

那么你会有一个像这样的查询

SELECT * FROM .... WHERE author_id NOT IN (1,12,567,6788) AND category_id NOT IN (6654,23245,89795)
于 2012-09-05T12:33:25.920 回答