sql-server - 存储总数或即时计算?

标签 sql-server database-design sql-server-2012

我的数据库中有许多表,其中包含用户可以喜欢、不喜欢、共享、收藏等的项目(照片、文章、视频)的信息。

每次用户对某个项目执行操作时,它都会记录在一个简单的表格中,如下所示:

ItemID | UserID  | Liked | Shared | Favourited
1        1         NULL    1        NULL
2        25        1       1        1
3        18        0       NULL     NULL

当我编写查询以返回表中的项目列表(例如照片)时,我还想返回每个项目拥有的喜欢、分享等的总数。目前,我正在使用嵌套的 SELECT 语句即时计算。如果我的项目表的大小增加了数十万,并且我经常需要点赞、分享等方面的统计数据,那么继续动态计算统计数据是否安全,还是应该将它们作为总数存储在数据库中的某个地方?

最佳答案

我建议不要存储总计,因为这似乎是一个事务性数据库,并且您将非常频繁地插入行,因此如果您存储总计,则每次插入一行时,您都需要更新总计。

所以实际上表中的每个插入都会跟在一个更新语句之后,只是为了保持总计更新。对于事务数据库来说,这听起来是一个非常糟糕的设计。

对于数据几乎没有变化(如果有的话)的数据仓库来说,存储总计是一个不错的选择。

我的建议是创建 View ,它会即时为您计算总计。添加适当的索引以提高这些查询的效率。当您的数据增长太大以至于连表上的索引都做得不够时,请考虑索引 View 。

关于sql-server - 存储总数或即时计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25944570/

相关文章:

database - SQL Server 代理作业执行历史日志是否保存到磁盘?

sql - T-SQL 计算不同年份范围之间的持续时间(以月为单位)

sql-server - 在 Windows Server Core 计算机上启用和配置 MS DTC

sql-server - 使用 SQL Server(和/或 Coldfusion)创建高效的搜索功能

database - 当我想存储从下拉列表中选择或用户输入的值时,数据库设计中的最佳做法是什么?

.net - 微软 Hadoop 集成

sql - 对大陆、国家和州的表中的层次值求和

sql-server - 从 Entity Framework 4 模型生成 SQL Server Express 数据库

mysql - 在这种情况下我应该使用多个数据库吗(Ruby on Rails)

c++ - 如何将 C++ 结构转换为数据库