1

我正在为一个更大的项目开发一个论坛组件,并考虑添加一个地狱禁令功能,其中一个模块可能会阻止除该用户之外的任何人查看用户的帖子。这基本上执行了“不要喂巨魔”规则,迫使每个人都忽略麻烦制造者。与此同时,麻烦制造者可能会变得无聊,因为他没有成功地从任何人那里得到提升,并希望继续前进。

我的第一个想法是在 post 表中添加一个“hellbanned”列,并创建一个“hellbanend”表。hellbanned 用户会将其 user_id 作为记录添加到 hellbanned 表中,此后他们所有未来的帖子都将其 hellbanned 列设置为 true。

因此,显示所有主题帖子的查询只会显示“hellbanned = False”的所有帖子。并且,post 操作将检查用户是否在 hellban 表中,如果是,则将 post 的“hellbanned”列设置为 True。

我不禁想到有更好的方法来做到这一点;我真的很感激一些建议。

4

1 回答 1

4

Hellbanning 存在于用户级别,而不是单个帖子,因此您根本不必将标志保留在帖子表的级别 - 事实上,这样做会使您面临数据不一致的情况(例如,应用程序错误可能导致“不完全”被地狱禁止的用户)。

相反,将被禁止的用户 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 表中,然后在 hellbanning 之后隐藏帖子,类似于...

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

或者,您可以只在 USER 表中保留 HELLBANNED 标志(和/或 HELLBANNED_DATE),但您需要小心正确地对其进行索引以获得良好的性能。

这实际上可能是比 HELLBANNED_USER 更好的解决方案,如果您仍然需要与 USER 联接(以显示每个帖子的其他用户信息),因此无需通过 HELLBANNED_USER 表进行额外搜索即可轻松访问该标志。

于 2012-11-14T07:57:47.853 回答