Database 如何处理这个数据库模式?

Database 如何处理这个数据库模式?,database,database-design,Database,Database Design,以SO为主要示例,假设某个问题的问题或答案被删除,但在删除前获得了几票。我想这些分数仍然是授予作者的(如果不是,让我们假设他们是),那么如何保持准确的总声誉呢 问题/答案是否实际上没有从数据库本身删除,并且可能有一个状态字段,该字段被处理并决定问题或答案是否可见 或者,事实上,它们被删除了,并且声誉依赖于系统在每次计票时持续准确,并且不一定有投票历史记录(如记录投票的问题)因此,据我所知,使用软删除和硬删除的组合。我可以肯定地说,我已经失去了被海报或主持人删除的问题所赢得的声誉。但这不是你问题的

以SO为主要示例,假设某个问题的
问题
答案
被删除,但在删除前获得了几票。我想这些分数仍然是授予作者的(如果不是,让我们假设他们是),那么如何保持准确的总声誉呢

问题/答案是否实际上没有从数据库本身删除,并且可能有一个状态字段,该字段被处理并决定问题或答案是否可见


或者,事实上,它们被删除了,并且声誉依赖于系统在每次计票时持续准确,并且不一定有投票历史记录(如记录投票的问题)

因此,据我所知,使用软删除和硬删除的组合。我可以肯定地说,我已经失去了被海报或主持人删除的问题所赢得的声誉。但这不是你问题的重点,所以

如果您希望能够推断出准确的总数,特别是如果您希望能够计算该总数(通过查看积分历史记录,您可以这样做),那么您需要保留交易信息,而不是一个连续的总数

如果您希望事务性记录点具有引用完整性,则需要使用软删除机制来隐藏“已删除”的问题


如果您没有保留交易日志,并且没有可软删除的问题来备份交易积分日志,则您将无法重新计算或证明积分总数。您还将很难显示随时间推移而获得的积分和累积声誉的图表。您可以通过保存每日点快照来绘制这些图表,但这在存储方面要比只跟踪上下投票更为繁重和昂贵。

不知道如何工作,但您提到的最后两个选项是显而易见的方法。我想哪一个最好取决于您是否希望能够完全删除一个问题以减少数据库中的数据。另外还有一个性能问题,就是必须查找所有以前的Q/a来求和总数,所以我猜他们会选择后者。这不是一个真正明确的问题。@Regulate这是您希望我澄清什么?我计划保留事务信息,并保留一个包含运行总数的字段。这应该保持引用的完整性,并且不需要重新计算每个人在每个页面负载上的信誉。这可以接受吗?缺点?如果是这样,什么时候应该重新评估一个人的声誉?这种预优化是不必要的吗?@Josh我通常建议不要进行预优化。如果您的负载测试或生产经验表明您需要保持一个非规范化的运行总数,那么继续这样做。但是,您必须准备好与您的用户就事务细节和计算的运行总数之间不可避免地存在的差异进行争论。如果是我,并且如果我发现预优化是必要的,那么我想我会在每次添加新事务时重新计算。这大概可以帮你省去阅读上的计算,而仅仅是写作上的计算。谢谢你的建议,乔尔。正如您所说,我将使用运行总数来节省对读取的计算,并将维护事务信息以供将来使用。