我正在为一个更大的项目开发一个论坛组件,并考虑添加一个hellban功能,其中mod可能会阻止除了该用户以外的任何人查看用户的帖子。这基本上强制了“不要让巨魔”#34;规则,迫使每个人忽视麻烦制造者。与此同时,麻烦制造者可能会感到无聊,因为他没有成功地从任何人中崛起并希望继续前进。
我的第一个想法是添加一个" hellbanned"邮政表中的列,并创建一个" hellbanend"表。一个hellbanned用户将其user_id作为记录添加到hellbanned表中,从此以后他们所有未来的帖子都会将他们的hellbanned列设置为true。
因此,显示所有主题帖子的查询只会显示所有帖子,其中' hellbanned = False'。并且,后期操作将检查用户是否在hellban表中,如果是,则设置帖子' hellbanned'列为True。
我无能为力,但我认为有更好的方法可以做到这一点;我真的很感激一些建议。
答案 0 :(得分:4)
Hellbanning存在于用户级别,而不是单个帖子,因此您根本不必将该标志保留在posts表的级别 - 事实上,这样做会让您对数据不一致(例如,应用程序错误可能会导致"不完全" hellbanned用户。)
相反,将hellbanned用户ID放到一个单独的表中(如果你的DBMS支持它:cluster它要避免"不必要的"表堆...)
CREATE TABLE HELLBANNED_USER (
USER_ID INT PRIMARY KEY,
FOREIGN KEY (USER_ID) REFERENCES USER (USER_ID)
)
...当需要排除hellbanned用户的帖子时,请按以下方式进行:
SELECT * FROM POST
WHERE USER_ID NOT IN (
SELECT USER_ID FROM HELLBANNED_USER
)
由于HELLBANNED_USER.USER_ID上的索引,这应该可以很好地执行。
hellbanned用户仍然在常规的USER表中,因此其他所有内容都可以继续为他们工作,而无需对代码进行重大更改。
显然,一旦用户被上面的hellbanned,所有的帖子(甚至那些在hellbanning之前制作的)都会变得不可见。如果您不想这样做,请将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表进行额外搜索。