Sql 在主表中存储计数

Sql 在主表中存储计数,sql,performance,count,Sql,Performance,Count,我有三个数据库表 用户(用户ID,…) 条目(EntryID,…) 喜欢(UserID,EntryID,…) 我的问题很简单。我应该在表Entries中使用LikeCount列,还是每次从Likes表中需要时都使用SELECT COUNT(*)语句?哪一种做法更好 这个问题可能是重复的:这个问题的给定答案基本上是不使用LikeCount,而是每次需要时都计数。但是,他们没有对以下问题给出令人满意的答案: 将计数存储在表中的不良后果是什么 如果我需要在应用程序中经常计算喜欢的次数,那么这两种不同方

我有三个数据库表

  • 用户
    (用户ID,…)
  • 条目
    (EntryID,…)
  • 喜欢
    (UserID,EntryID,…)
  • 我的问题很简单。我应该在表
    Entries
    中使用
    LikeCount
    列,还是每次从
    Likes
    表中需要时都使用
    SELECT COUNT(*)
    语句?哪一种做法更好

    这个问题可能是重复的:这个问题的给定答案基本上是不使用
    LikeCount
    ,而是每次需要时都计数。但是,他们没有对以下问题给出令人满意的答案:

  • 将计数存储在表中的不良后果是什么
  • 如果我需要在应用程序中经常计算喜欢的次数,那么这两种不同方法的性能分析是什么

  • PS:如果SQL Server 2008很重要,我会使用它。

    将计数存储在表中的不良后果是什么:

    这种方法有两个问题:

  • 您必须使用数据库触发器或应用程序代码使计数在Likes表更改时保持最新

  • 如果你错了#1,你必须面对这样一个事实:LikeCount可能与like的数量并不匹配

  • 如果我需要在应用程序中经常计算喜欢的次数,这两种不同方法的性能分析是什么:

    我相信,如果为Likes表创建索引,大多数数据库引擎将能够非常快速地回答COUNT(*)查询,而无需引用实际的表。基本上,在索引中,数据库跟踪与给定键匹配的行数,这与您的LikeCount相同

    如果要编写如下查询:

    SELECT count(*) from Likes where EntryID=45;
    
    SELECT count(*) from Likes where EntryID=45 and deleted=False;
    
    然后索引必须位于EntryID上

    但是,如果要编写如下查询:

    SELECT count(*) from Likes where EntryID=45;
    
    SELECT count(*) from Likes where EntryID=45 and deleted=False;
    
    然后必须打开索引(EntryID,deleted)