0

我有一张表,用于存储用户用户的评论。我将有 1 亿多条评论。

我可以创建它的 2 种方法:

选项 1:用户名和评论 ID 为 PK。这样,所有评论都按用户名和评论 ID 物理存储。

CREATE TABLE [dbo].[Comments](
    [user] [varchar](20) NOT NULL,
    [com_id] [int] IDENTITY(1,1) NOT NULL,
    [com_posted_by] [varchar](20) NOT NULL,
    [com_posted_on] [smalldatetime] NOT NULL CONSTRAINT DEFAULT (getdate()),
    [com_text] [nvarchar](225) COLLATE NOT NULL,
 CONSTRAINT [PK_channel_comments] PRIMARY KEY CLUSTERED 
 ([channel] ASC, [com_id] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]

优点:我的查询将通过comment_id DESC 获取用户订单的所有或前10 条评论。这是寻找

选项 2:我可以将评论 ID 设为 PK。这将存储按评论 ID 排序的评论,而不是用户名。

缺点:获取给定用户的最新前 10 条评论不再是一种搜索,因为数据不是由用户存储的(即不按用户排序)。所以我必须创建其他索引来提高查询性能。

哪种方式是最好的方式?插入和删除呢?这些操作是允许的。但是经常阅读。

用户不能修改他们的评论。

我用 1.1M 行测试了两个表。结果如下:

table_name  rows        reserved    data        index_size  unused
comments2   1079892     99488 KB    62824 KB    36576 KB    88 KB  (PK: com_id  Second Index on (user_name, com_id))
comments1   1079892     82376 KB    82040 KB    328 KB      8 KB   (PK: user_name, no other indices)
--------------------------------------------------------------------
diff:       same rows   17112KB     -19216KB    36,248KB    80KB

因此,以 com_id 为 PK 的表使用 36MB 额外磁盘空间仅用于 2 索引 使用 SEEK 在两个表上选择顶部查询,但以 com_id 作为 PK 的表较慢但是当我将 com_id 作为 PK 时插入速度稍快

任何意见?

4

5 回答 5

2

我会使用评论 ID 作为表的主键。如果您要进行大量使用评论 ID 和用户名的查询,那么在这些字段上添加索引可能更简单。

于 2010-10-21T16:17:01.153 回答
0

我不会在 PK 中使用用户名,因为它可能会改变,以后会产生级联更新问题。此外,将这两个连接到 PK 中会创建一个 large(r) PK,它可能必须作为 FK 传递给其他表。我尝试使看起来像 FK 的 PK 尽可能小,除非我知道我希望将所有贡献表的 PK 放在一个大键中以提高查询速度。评论ID应该没问题。您可能需要创建一个额外的索引来快速搜索评论 ID 和用户名。你会做更多的插入/更新或查询吗?如果查询密集,则索引不是问题。

于 2010-10-21T16:47:04.950 回答
0

您确定您的 CREATE TABLE 语句正确吗?您在 PK 定义中使用 [Channel],我不认为它是一列。你的意思是[用户]。

您在某个地方有用户表吗?如果是这样,您可以通过将其键入整数值并将 UserID(而不是 User)放入注释表中来节省大量开销。

我会在 CommentID 上进行 PK,然后在 [UserID, CommentID] 上添加一个非聚集索引。这使您可以立即通过 ID 访问评论(用于删除等),而无需在 WHERE 子句中涉及 UserID 值;它提供了对用户评论的快速访问。但是,我不倾向于使用您预期大小的表格。

于 2010-10-21T16:55:43.297 回答
0

我最初的方法是将 CommentID 单独作为 PK,可能按降序排列,这样您就不必对选择进行任何重新排序。然后在 UserID 上放置一个索引。

如果您使用连接键,请考虑将 CommentID 切换为 desc。

于 2010-10-21T17:45:32.910 回答
0

根据经验,总是选择最窄的 PK。然后,为了提高性能,您可能希望使用基于整数的 User_id 而不是 varchar,并为两列添加索引。

最好的方法取决于用户的数量,如果你只有几个用户,commet_id user_id pk 可能会更好(此外,用户分区是一个选项);另一方面,如果用户数量多,组合的 Pk 将毫无用处。

于 2010-10-21T17:33:24.000 回答