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 表进行额外搜索即可轻松访问该标志。