我目前正在设计一个功能类似于facebook Feed的仪表板Feed。 Feed将包含以下内容:
上面的每一个都存储在它自己的表中,但在Feed页面上,它们应该全部混合在一起。那没关系,所以我想到的第一件事就是桌子。使用表格,它更容易调试,允许我保留历史数据,如果我需要使用if用于其他目的,例如,如果我们为用户提供粘贴通知的能力,则很容易更改。
所以我和我的经理一起讨论了我的解决方案,他说使用视图可能会更好,因为SELECT占用的资源比典型的删除和插入少得多。我同意他的意见,因为在每个页面加载开始时,我必须对表进行清理,删除未使用的记录,删除不再有效的项目,并重新填充更新的数据。现在,如果他们不断刷新,那么就没有工作可做,因此性能上升也不错,但如果1000个用户同时访问该网站,如果填充了一个表,可能会有巨大的性能损失所有这些用户。
我想我对使用视图的唯一顾虑是,我是历史数据的傻瓜,而后来如果用户想要自定义视图,它会更容易;但是在这一点上没有提到这一点,所以表现是目前唯一的问题。
以下是通知需要做的事情:
这是我的两张桌子,帮助我完成这项任务:
通知
- id
- user_id(如果为null,则所有用户都可以查看此项目)
- table_pk(此链接到的表的主要ID)
- 表格(此行链接到的表格)
- 粘性(粘性物品)
- date_added(添加日期)
notifications_removed
- id
- notification_id
- user_id
现在我有一个刷新该表的刷新功能,但我的经理想到的是我们摆脱了通知表并将其转化为视图。这样做会有好处吗?如上所述,每次都会刷新这些项目,因此性能受到影响的是我的方式必须对通知表进行表清理,而视图只是选择并将事物连接在一起。另一方面,我看到的唯一不利的一面是,我将失去通知的灵活性和历史,现在这不是一件大事。
答案 0 :(得分:0)
非物化视图(MySQL不支持物化视图)与准备好的SELECT语句没什么区别 - 您可以并排运行两个并且性能相同。应用于视图的简单WHERE子句(谓词)可以推送到内部查询中,但这意味着没有数据操作(IE:列上的函数,聚合函数等)。
使用正在汇总的数据视图替换通知将减轻对表的更新,使系统更“实时”。您是否需要方便的历史数据?您可以从备份中恢复它(虽然通过大量备份重建数据很麻烦),或者您可以在数据中添加一个标志,这样就不会从表中删除已删除的数据 - 该标志只是控制可见性(但是这个意味着持有更多数据)。
如果您在其他问题中提供了有关情况的更多详细信息,我们可以帮助您进行优化。通常,您可以在可能的情况下缓存数据,因为数据库跳闸很昂贵,但这是决定何时刷新缓存的平衡行为。