我在我的网站上制作了一个类似于堆栈溢出的“信誉”类型功能。 我想在标题中按名字显示他们的点数。
我不希望每次移动到另一个页面时都要为此执行db调用。
有人能提出一个很好的方法来实现这个吗?
答案 0 :(得分:3)
不要仅为此进行db调用,而是在获取其他所有内容时从数据库中获取数据。
遵循一个请求响应周期的原则,一个数据库调用。这只是加入查询中其他表的问题。
例如,如果你看一个有问题和一堆答案的页面。您知道原始问题的“用户”,并且您知道每个答案和评论的“用户”。因此,当您获取信息时,也会加入每个用户的相关信息。它实际上只是加入了其他表,您可以在一次数据库调用中有效地获取所需的所有数据。
当您调用数据库(如MSSQL服务器)时,您可以在一次调用中返回多个结果集,因此您也不限于单个结果集。
编辑:
以下是一个存储过程(或只是SQL语句)示例,它在一次数据库调用中产生5个结果集。
ALTER PROCEDURE [dbo].[GetPostWithSlug]
@PostSlug varchar(80)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @PostId int;
SELECT @PostId = PostId
FROM dbo.Post
WHERE PostSlug = @PostSlug
SELECT PostId, PostDate, PostSlug, dbo.[User].UserFirstName + ' ' + dbo.[User].UserLastName AS PostedBy, PostTitle, PostText, PostIsPublished, PostIsPublic, PostTitleImg, PostUpdatedDate, dbo.[User].UserWebsite AS AuthorWebsite
FROM dbo.Post
INNER JOIN
dbo.[User]
ON dbo.[User].UserId = dbo.Post.UserId
WHERE PostId = @PostId
/* SubCategories for Post */
SELECT dbo.PostSubCategory.PostId, dbo.Category.CategoryId, dbo.SubCategory.SubCategoryId, dbo.Category.CategoryDescription, dbo.SubCategory.SubCategoryDescription
FROM dbo.Category
INNER JOIN
dbo.SubCategory ON dbo.Category.CategoryId = dbo.SubCategory.CategoryId
INNER JOIN
dbo.PostSubCategory ON dbo.SubCategory.SubCategoryId = dbo.PostSubCategory.SubCategoryId
INNER JOIN
dbo.Post ON dbo.Post.PostId = dbo.PostSubCategory.PostId
WHERE dbo.Post.PostId = @PostId
ORDER BY dbo.PostSubCategory.PostId
/* Tags for Post */
SELECT dbo.PostTag.PostId, dbo.Tag.TagId, dbo.Tag.TagDescription
FROM dbo.PostTag
INNER JOIN
dbo.Tag ON dbo.Tag.TagId = dbo.PostTag.TagId
INNER JOIN
dbo.Post ON dbo.Post.PostId = dbo.PostTag.PostId
WHERE dbo.Post.PostId = @PostId
ORDER BY dbo.PostTag.PostId, dbo.Tag.TagDescription
/* Custom Groups for Post */
SELECT dbo.PostCustomGroup.PostId, dbo.CustomGroupHeader.CustomGroupHeaderId, dbo.CustomGroup.CustomGroupId
FROM dbo.CustomGroup
INNER JOIN
dbo.CustomGroupHeader ON dbo.CustomGroupHeader.CustomGroupHeaderId = dbo.CustomGroup.CustomGroupHeaderId
INNER JOIN
dbo.PostCustomGroup ON dbo.PostCustomGroup.CustomGroupId = dbo.CustomGroup.CustomGroupId
WHERE dbo.PostCustomGroup.PostId = @PostId
EXEC GetCommentsForPost @PostId
END
在C#代码中,您的DbDataReader将保存多个结果集,可以通过调用NextResult()来获取这些结果集。或者,如果您正在填充DataSet,则只需使用适配器的Fill方法。
我在我的博客Matlus - Internet Technology and Software Engineering上使用此技术,您可以看到该网站的速度(响应速度)。 ExposureRoom使用了相同的技术,这是一个拥有大量流量的公共社交网站。
答案 1 :(得分:1)
你正在寻找一些做甜甜圈洞缓存的方法:
https://stackoverflow.com/search?q=[asp.net-mvc]+donut+hole+caching
答案 2 :(得分:0)
如果它只是需要缓存的部分页面的一小部分,则可以使用子操作来呈现该部分并缓存它。示例:http://www.asp.net/learn/whitepapers/mvc3-release-notes#_Toc276711791