Asp.net 计算评论/帖子的数量

Asp.net 计算评论/帖子的数量,asp.net,sql,Asp.net,Sql,我正在使用ASP.net和SQL数据库。我有一个类似于博客的系统,其中对一篇文章发表了大量评论,我想在文章旁边显示这些评论的数量。为了得到这个数字,我可以将它保存在post记录中,并在添加或删除评论时添加/子跟踪,也可以使用SQL在用户每次点击页面时使用查询计算评论的数量。后者似乎是一个坏主意,因为它将更严重地打击我的SQL数据库,但是根据记录保留数字感觉可能很容易出错。在这种情况下,您认为最佳的编码实践是什么?我认为SQL语句应该可以。另一种是重复已有的数据。计数查询应该很快。始终从规范化数据

我正在使用ASP.net和SQL数据库。我有一个类似于博客的系统,其中对一篇文章发表了大量评论,我想在文章旁边显示这些评论的数量。为了得到这个数字,我可以将它保存在post记录中,并在添加或删除评论时添加/子跟踪,也可以使用SQL在用户每次点击页面时使用查询计算评论的数量。后者似乎是一个坏主意,因为它将更严重地打击我的SQL数据库,但是根据记录保留数字感觉可能很容易出错。在这种情况下,您认为最佳的编码实践是什么?

我认为SQL语句应该可以。另一种是重复已有的数据。计数查询应该很快。

始终从规范化数据库开始(第二个选项)。仅当出于性能原因绝对需要时才进行非规范化。以非规范化的方式设计它(正如您所猜测的那样,这很容易出错)是过早的优化。有了适当的索引,可以很好地动态计算数字。

不要过早优化。仅在需要优化时才使用简单解决方案和pagefault。

每次需要信息时,我都会查询数据库。如果您发现性能不足,我将在稍后重新讨论(稍后优化)。对于大多数博客类型的应用程序将获得的流量,这应该足够了。

取决于数据模型的外观…不要将帖子总数添加到主线程记录中,这很容易出错,您应该根据线程ID在需要时计算评论数,IMHO

缓存页面并在添加/删除注释时更新缓存将是SQL count查询的一个很好的选择,如果您担心数据库中出现的查询数量。

也许可以将计数作为主线程查询的一部分,以限制从数据库中访问实际数据库的次数网络服务器。但是我总是查询实际的计数,而不是试图将其保存在字段中,数据最终会失去同步,因为这是事实。

我通常使用索引视图来处理这类事情。这允许您对数据进行非规范化以快速检索,但无法使其失去同步。人们也不会感到困惑,认为视图是数据的主人。我主要使用SS2K5的标准sku,因此我必须指定(noexpand)提示,以使其实际使用视图上的索引(enterprise将自动执行)。所以对于标准sku,我总是创建一个每个人都点击的包装器视图,这样我就知道提示总是在适当的位置

在网页上进行编码,希望没有语法错误;)

所以我在实际的索引视图上使用了一个命名法,让每个人都知道不要直接查询它。相反,它们寻找执行noexpand提示的相关包装器视图。使用索引视图会迫使您进行大计数,因此我经常在包装器视图中向下转换为int,以便能够使用32位int惰性地保留我们的asp.net代码。省略演员阵容会更好,但这对我没有任何重大影响


编辑-我可以告诉你,论坛软件总是对线程表的post计数进行非规范化。如果你有一个活跃的论坛,那么在每次页面浏览中持续统计帖子数量会导致数据库崩溃。我喜欢mssql具有索引视图,因此您可以声明式定义非规范化,而不是自己维护它

为了提高性能,您可以在主表中保留一个标志,指示该项是否有注释,但仅将其用作是否在以后执行额外查询以计数和检索注释的“提示”

想象一下,一个照片库返回50张照片进行旋转。每张照片都可以有自己的评论

初始页面加载将返回照片列表和一个标志,指示照片是否有评论

显示照片时,如果comments标志设置为True,则应用程序将发出ajax请求以计数和获取该照片的评论

如果50张照片中只有3张有评论,那么您只需为自己保存47个附加请求

这确实使数据非规范化,但在有限的层面上。
创建提示确实有助于提高非常繁忙的站点的性能。

我喜欢这个答案与Jesse Brown的答案相结合:非规范化将是“重复已有的数据”
create view postCount__
as
select
    threadId
    ,postCount=count_big(*)
from thread
group by threadId
go
create unique clustered index postCount__xpk_threadid on postCount__(threadId)
go
create view postCount
as
select
    threadId
    ,postCount=cast(postCount as int)
from postCount__ with (noexpand)
go