4

ユーザーがコンテンツ ソース (users/categories/words/?) のブラックリストを作成できるようにしたいと考えています。これらのソースからのコンテンツを表示できないようにする必要があります。

例: ユーザー A がユーザー B をブラックリストに登録し、ユーザー B が写真をアップロードした場合、ユーザー A がギャラリーを表示するよう要求した場合、ユーザー B の写真は表示されませんが、ユーザー C、D、... の写真は表示されます。 ..

この問題は、1 人のユーザーが大きなブラックリスト (たとえば、100 ソース) を作成したときに発生します。その場合、SQL クエリは非常に長く複雑になり ("...and author != 'B' and category != 'C'...")、最終的にサーバーが停止します。

この問題を処理する他の方法は何ですか?

4

3 に答える 3

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 に答える
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

このクエリを作成するために動的 SQL を使用しているように思えます。UserId によって関連付けられたテーブルにブラックリストを格納する必要があります。その後、NOT INまたはを使用NOT EXISTSして最終的な結果セットを構築するストアド プロシージャを記述できます。

于 2012-09-05T12:07:09.690 に答える