2009-05-01 155 views
3

我正在使用ASP.net和SQL数据库。我有一个博客喜欢系统,其中一些评论是针对一个帖子进行的,我想显示帖子旁边的评论数量。为了得到这个数字,我可以将它保存在帖子记录中,并在添加或删除评论时添加/减去,或者我可以在用户每次点击页面时使用SQL来计算查询的数量。后者似乎是一个坏主意,因为它会打击我的SQL数据库更困难,但保持数字对记录感觉像它可能容易出错。你认为在这种情况下最好的编码实践是什么?计算评论数/帖子数

回答

3

总是从规范化的数据库开始(第二个选项)。如果您对性能原因有绝对必要性,则必须进行非规范化处理。以非规范化的方式进行设计(如您猜测的那样容易出错)是不成熟的优化。有了适当的指数,它应该很好地计算飞行中的数字。

+1

我喜欢这个答案与Jesse Brown的答案相结合:非规范化将是“你已有的数据重复”。 – Travis 2009-05-01 20:48:04

2

我认为SQL语句应该没问题。另一个是你已有的数据重复。计数查询应该很快。

2

不要过早优化。仅在需要时才在优化中使用简单的解决方案和页面错误。

1

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

0

根据您的数据模型的外观...不要将总发布数添加到主线程记录中,这是容易出错的,您应根据线程ID计算需要的注释数,恕我直言

0

如果您担心发生针对db的查询次数,缓存页面并更新该缓存作为注释被添加/删除将是一个很好的选择长SQL查询。

1

也许得到作为主线程查询的一部分进行计数,以便限制来自Web服务器的实际数据库的点击次数。但是我会一直查询实际数量,而不是试图将其保留在一个领域,数据最终会失去同步,因为这是现实。

0

我通常使用索引视图这种事情。这使您可以对数据进行非规范化处理以进行快速检索,但无法使其不同步。人们也不会感到困惑,并认为该观点是数据的主人。我主要使用SS2K5的标准sku,所以我必须指定(noexpand)提示才能真正使用视图上的索引(企业会自动执行此操作)。所以对于标准的sku,我总是创建一个每个人都打的包装视图,所以我知道这个提示总是存在。

网页上的编码本,所以希望没有语法错误;)

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 

于是我就用实际索引视图中的命名让大家知道不直接查询。相反,他们会查找强制执行noexpand提示的关联包装视图。使用索引视图迫使你执行count_big,所以我经常在包装视图中将其转换为int,以便能够使用32位整数来持久保留我们的asp.net代码。省略演员会更好,但对我来说没有任何重大影响。

编辑 - 我可以告诉你,论坛软件总是非规范化帖子数到线程表。如果你有一个活跃的论坛,它会杀死数据库以不断计算每个页面视图的帖子数量。我喜欢mssql对索引进行索引,因此您可以声明性地定义非规范化,而不是自己维护它。

1

为了提高性能,您可以在主表中保留一个标记,以指示该项目是否有任何评论,但仅将其用作'提示',以指示是否执行额外的查询来计算并检索评论以后的时间。

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

初始页面加载将返回一张照片列表以及一个指示照片是否有评论的标志。

当显示照片时,如果评论标志设置为True,您的应用程序将发出ajax请求来计算并获取该照片的评论。

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

这确实使数据非规格化,但在有限的水平上。 创建提示确实可以帮助提高非常繁忙的站点的性能。