1

私はより大きなプロジェクトのフォーラム コンポーネントに取り組んでおり、mod がユーザーの投稿をそのユーザー以外が閲覧できないようにするヘルバン機能を追加することを検討していました。これは基本的に「荒らしに餌をやるな」というルールを強制し、誰もがトラブルメーカーを無視するように強制します。その間、トラブルメーカーは、誰からも利益を得ることができず、うまくいけば先に進むことができないため、退屈する可能性があります。

私が最初に考えたのは、投稿テーブルに「hellbanned」列を追加し、「hellbanend」テーブルを作成することでした。hellbanned ユーザーの user_id は、レコードとして hellbanned テーブルに追加され、今後のすべての投稿では、helbanned 列が true に設定されます。

したがって、トピックのすべての投稿を表示するクエリは、'hellbanned = False' のすべての投稿を表示するだけです。また、投稿操作は、ユーザーがヘルバン テーブルにいるかどうかを確認し、そうであれば、投稿の「ヘルバン」列を True に設定します。

これを行うためのより良い方法があると思わずにはいられません。いくつかの提案をいただければ幸いです。

4

1 に答える 1

4

Hellbanning は個々の投稿ではなく、ユーザーのレベルで存在するため、posts テーブルのレベルでフラグを保持する必要はまったくありません。 「不完全な」ヘルバンユーザーにつながる)。

代わりに、ヘルバンされたユーザー ID を別のテーブルに配置します (DBMS がサポートしている場合は、「不要な」テーブル ヒープを避けるためにクラスター化します)...

CREATE TABLE HELLBANNED_USER (
    USER_ID INT PRIMARY KEY,
    FOREIGN KEY (USER_ID) REFERENCES USER (USER_ID)
)

...そして、ヘルバンされたユーザーの投稿を除外するときが来たら、次のようにします。

SELECT * FROM POST
WHERE USER_ID NOT IN (
    SELECT USER_ID FROM HELLBANNED_USER
)

これは、HELLBANNED_USER.USER_ID のインデックスにより、うまく機能するはずです。

ヘルバンされたユーザーは通常の USER テーブルに残っているため、コードを大幅に変更することなく、他のすべての機能を引き続き使用できます。


明らかに、ユーザーが上記でヘルバンされると、そのすべての投稿 (ヘルバン以前に作成されたものも含む) が見えなくなります。それを望まない場合は、HELLBANNED_DATE フィールドを hellbanned テーブルに追加してから、同様にヘルバン後の投稿を非表示にします...

SELECT * FROM POST
WHERE NOT EXISTS (
    SELECT * FROM HELLBANNED_USER
    WHERE POST.USER_ID = HELLBANNED_USER.USER_ID
        AND POST_DATE >= HELLBANNED_DATE
)

または、HELLBANNED フラグ (および/または HELLBANNED_DATE) を USER テーブルに保持することもできますが、パフォーマンスを向上させるために、適切にインデックスを作成するように注意する必要があります。

これは実際には HELLBANNED_USER よりも優れたソリューションである可能性があります。とにかく USER と JOIN する必要がある場合(投稿ごとに追加のユーザー情報を表示するため)、HELLBANNED_USER テーブルで追加の検索を行わなくてもフラグに簡単に到達できます。

于 2012-11-14T07:57:47.853 に答える