我有一個應用程序顯示帖子,並且對於每個帖子,用戶可以說他們是否喜歡該帖子。 對於每篇文章,我應該顯示有多少用戶喜歡它,有多少人不喜歡它。 假設我有這些表:SQL Server:表設計中的幫助
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語句。
任何想法是值得歡迎的。
如果您一次更新單個帖子,不應該有任何表鎖定的風險。還有什麼原因你使用文本vs(n)varchar(max)數據類型? – etliens 2012-03-18 18:47:31