Optimization 直接从数据库或缓存生成网页?

Optimization 直接从数据库或缓存生成网页?,optimization,architecture,Optimization,Architecture,[我不是在问SO的体系结构,但这将有助于回答这个问题。] 因此,当用户点击他/她的名字并点击“回复”时,他们会看到其他用户对他们参与的评论线索、问题和答案的回复。我一直在暗自怀疑我错过了某些响应,这让我想:如果你必须构建那个东西,你会在每次用户请求时动态地从数据库中提取所有内容吗?或者当应用程序中有新的相关活动时,你会修改它吗?或者您会在夜间守护进程中构建它 我想真正的答案是每次都是动态构造的,但是表是以这样一种方式进行非规范化的,以便减少耗时您将如何构建它? 当然,我询问的是任何平台,不仅仅是

[我不是在问SO的体系结构,但这将有助于回答这个问题。]

因此,当用户点击他/她的名字并点击“回复”时,他们会看到其他用户对他们参与的评论线索、问题和答案的回复。我一直在暗自怀疑我错过了某些响应,这让我想:如果你必须构建那个东西,你会在每次用户请求时动态地从数据库中提取所有内容吗?或者当应用程序中有新的相关活动时,你会修改它吗?或者您会在夜间守护进程中构建它

我想真正的答案是每次都是动态构造的,但是表是以这样一种方式进行非规范化的,以便减少耗时您将如何构建它?


当然,我询问的是任何平台,不仅仅是.Net上的平台。

我每次都会从数据库中动态地提取它。我认为这会让你从用户体验中得到最好的结果,然后我会运用过早优化是有害的这一原则。以后如果出现性能问题,我会研究缓存


我认为将其作为守护进程/推送进程实际上会导致完成更多的总体工作。也就是说,更新会比用户请求信息的频率更高。

显然,当发布答案或评论时,您需要确定应该在其“回复”选项卡中通知的用户。然后,只需向responses表中添加一行,其中包含响应文本、时间戳和它所属的用户。这样,您就可以使用简单的

select * from responses where user=<userid> order by time desc limit 30
从响应中选择*,其中用户=按时间顺序描述限制30
或者类似的


p.s.对于任何能够编写查询以删除旧响应的人来说都是额外的奖励——假设每个人的“响应”选项卡中都应该有最后30个响应。

我希望userid是聚集索引的自然选项。如果您有一个“活动”布尔字段,那么您不需要太担心锁;除了更新(未索引的)活动列外,该表只能写入。我打赌它已经是这样了,因为看起来一切都是可以恢复的


不需要额外的信用响应移除程序。

我假设这在数据库中是非规范化的。注释表可能同时具有and ANSWERK\u id和ANSWERK\u uid,因此查找答案注释的SQL仅针对注释表运行。同样的设置也适用于答案表。每个答案都有一个问题id和一个问题uid


话虽如此,它们可能是同一个表,您有response\u to\u id和response\u to\u uid,这使得许多代码更简单,并且使“recent”选项卡也成为一个单一的选择。事实上,两种选择之间的区别是一种使用uid,另一种使用对uid的响应。

我认为您的UI和数据库都应该由您的应用程序域驱动;因此,它们将根据它们在那里的共同起源相互反映

使用Fowler等人讨论的简化对象角色建模,提供一些快速说明

实体

用户
问题
答案
评论

实体角色
(注意:在对象角色建模中,大多数角色是自反的。有些角色,例如这里的布尔人,是单极的)

问题已提交给用户
问题有问题版本
问题作为答案
问题有意见

答案有答案版本
答案有评论

问题已提交给用户
问题版本有文本
问题版本具有时间戳
已删除QuestionVersion(可从非空时间戳eg推断)
问题版本已由用户删除
QuestionVersion已删除时间戳

答案有用户
应答版本有文本
应答版本有时间戳
答案已删除
应答版本已由用户删除
应答版本已删除时间戳

评论包含文本
评论有用户
注释具有时间戳
注释被删除(布尔值)

(注:无评论版本)

我认为这是最基本的。这些断言驱动ORM中的ERD。希望他们如何推动用户故事也是不言而喻的


我不认为像这样的规范化设计的实现需要非规范化——特别是因为我认为(从行为上)很明显,查询=>UI显示缓存为每分钟刷新1次。

这是一个非常有趣的问题。感谢大家进入太空!只是想让自己从无知中解脱出来……你只能为那些在过去X分钟内帐户上有活动的用户推送。这一点很好。我会先尝试最简单的方法,因为我想性能已经足够了。是的,我刚刚开始质疑所有的反优化言论。我认为,如果你想让responses选项卡始终控制100%的响应(事实并非如此),那么你就必须事先计划好这种复杂性。。。通过消息队列进行异步更新很有趣,也许……如果队列具有适当的字段和索引,则与队列的“挂起事务”查询联合的数据库查询可以工作。任何合理的设计都会使队列100%存储在内存中。我同意,我认为尝试设计一个可伸缩的体系结构并不是过早的优化。但是你可以删除评论,例如,将自己从线程中删除。我应该尝试一下,看看我是否仍然得到通知。删除的评论确实会,或者至少过去会出现在“回复”选项卡中。你的两条评论都没有出现在“我的回复”选项卡中,因此我很想知道它是如何工作的。在“回复”选项卡中,你可以在帖子上找到问题和评论的答案。你找不到对评论的回应;例如,您不会在您的回复中找到此评论