【发布时间】:2012-03-18 15:36:26
【问题描述】:
我有一个显示帖子的应用程序,对于每个帖子,用户都可以说出他们是否喜欢该帖子。 对于每个帖子,我应该显示有多少用户喜欢它,有多少用户不喜欢它。 假设我有这些表:
CREATE TABLE [dbo].[Post](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Quotation] [text] NOT NULL,
CONSTRAINT [PK_Post] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[UserPostAction]( --Every action of the user (like or dislike) is recorded to this table
[PostId] [bigint] NOT NULL,
[UserId] [bigint] NOT NULL,
[ActionValue] [int] NOT NULL, --Like / Dislike
CONSTRAINT [PK_UserPostAction] PRIMARY KEY CLUSTERED
(
[PostId] ASC,
[UserId] ASC,
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
在性能方面,最好的方法是使用 select 语句返回包含喜欢/不喜欢统计信息的帖子列表:
A) 向 Post 表添加另外 2 列:TotalLike 和 TotalDislike,当向 UserPostAction 插入新记录时,我会更新这些列吗?这样,当从 Post 表中选择帖子时,我将已经计算出统计信息。
B) 添加第三个表:PostStat ([PostId], [TotalLike], [TotalDislike]) 并以批处理的方式更新该表。 select 语句将使用 Post.Id = PostStat.PostId 上的 Inner Join 来检索统计信息。
C) 你能想到的任何其他方式。
希望我有一个包含数百万帖子的数据库,并且很多用户会经常查询 Post 表。 请记住,统计信息会非常频繁地更新,因为很多用户会喜欢或不喜欢很多帖子。这意味着(可能)执行大量更新和表锁定,这会干扰返回要显示的帖子的 select 语句。
欢迎提出任何想法。
【问题讨论】:
-
如果您一次更新单个帖子,则不应有任何锁定表的风险。还有什么原因您使用 text vs (n)varchar(max) 数据类型?
标签: sql sql-server database-design