我正在使用ASP.net和SQL数据库。我有一个类似于博客的系统,其中针对帖子发表了大量评论,我想在帖子旁边显示这些评论的数量。要获得该数字,我可以将其保留在帖子记录中,并在添加或删除注释时添加/子记录,或者每次用户点击页面时我都可以使用SQL来计算使用查询的注释数量。后者似乎是一个坏主意,因为它会更难打到我的SQL数据库,但是对着记录保持数字感觉它可能容易出错。在这种情况下,您认为最佳编码实践是什么?
答案 0 :(得分:3)
始终使用规范化数据库(第二个选项)。如果出于性能原因绝对需要,则仅进行非规范化。以非规范化方式设计它(如您所猜测的那样容易出错)是过早优化。使用适当的索引,应该可以很好地计算出数字。
答案 1 :(得分:2)
我认为SQL语句应该没问题。另一种是你已经拥有的数据重复。计数查询应该很快。
答案 2 :(得分:2)
不要过早优化。仅在需要时才在优化中使用简单解决方案和pagefault。
答案 3 :(得分:1)
每次你想要这些信息我都会查询数据库。如果你发现缺乏性能(稍后进行优化),我会在以后再次访问它。对于大多数博客类型应用程序将获得的流量,这应该足够了。
答案 4 :(得分:1)
也许将计数作为主线程查询的一部分进行计数,以限制来自网络服务器的实际数据库的点击次数。但我总是会查询实际的数量,而不是试着把它保存在一个字段中,数据最终会变得不同步,因为这是现实。
答案 5 :(得分:1)
为了提高性能,您可以在主表中保留一个标志,以指示该项是否有任何注释,但仅将其用作“提示”,以确定是否执行其他查询来计算和检索注释。以后的时间。
想象一下可以返回50张照片的照片库。每张照片都有自己的评论。
初始页面加载会返回一个照片列表以及一个标记,指示照片是否有评论。
当显示照片时,如果评论标志设置为True,您的应用会发出ajax请求来计算并获取该照片的评论。
如果50张照片中只有3张有评论,那么你只需要额外增加47个请求!
这会对数据进行非规范化,但是在有限的级别上。 创建提示确实可以帮助提高非常繁忙的站点的性能。
答案 6 :(得分:0)
取决于您的数据模型的外观...不要将总帖子数添加到主线程记录中,这很容易出错,您应该根据线程ID计算评论计数,恕我直言
答案 7 :(得分:0)
如果您担心针对数据库发生的查询数量,那么在添加/删除注释的情况下缓存页面并更新该缓存将是一个很好的选择,如果你担心发生了对数据库的查询数量。
答案 8 :(得分: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索引了视图,因此您可以声明性地定义非规范化而不是自己维护它。