适用评论的正确数据结构

时间:2012-08-28 19:50:21

标签: c# sql database-design

在建筑层面上一直在努力。

我有一个可以评论的对象,我们称之为Post。每个帖子都有一个唯一的ID。

现在我想评论该帖子,我可以使用ID作为外键,每个PostComment都有一个与Post相关的ItemID字段。由于每个帖子都有一个唯一的ID,因此很容易分配“顶级”评论。

当我评论评论时,我觉得我现在需要一个PostCommentComment,它附加到PostComment的ID上。由于ID是按顺序分配的,因此我不能再简单地使用ItemID来区分注释分配在树中的位置。 I.E.发布和发表评论的ID可能都是'5',因此我的外键关系无效。

这似乎可以无限期地继续下去,使用PostCommentCommentComment等...

解决这个问题的最佳方法是什么?我应该在评论中有一个名为“IsPostComment”的字段或类似的东西来知道要将ID附加到哪个集合?这让我觉得这是迄今为止我见过的最好的解决方案,但现在我觉得我需要进行递归的DataBase调用,这些调用开始变得昂贵。

意思是,我得到Post并获得所有PostComments where ItemID == Post.ID && where IsPostComment == true

然后我把它作为一个集合,收集PostComments的所有ID,再做一次搜索where ItemID == PostComment[all].ID && where IsPostComment == false,然后无限重复。

这意味着我为每个图层调用一次,如果我正在调用100个帖子,我可能会进行1000个DB调用,每次调用10个注释。

正确的方法是什么?

3 个答案:

答案 0 :(得分:2)

我只有一个名为Post的表。

CREATE TABLE Post
(
    PostID int PK,
    PostContent nvarchar,
    ParentPostID int FK null,
    ...
)

帖子将包含ID,发布内容以及您需要的任何其他字段。它还有一个ParentPostID,它是nullable,外键是PostID。如果ParentPostIDnull,您就知道它是原始帖子。如果有父母,则您知道帖子是评论。这允许您根据需要嵌套注释。

答案 1 :(得分:1)

我会说你只有PostComment,而不是PostCommentComment或其他任何东西。

所有PostComments都有一个PostId,所以当您为该帖子加载评论时,只需按PostId查询。

所有评论也都有ParentId,它指向另一条评论(顶级评论不会有ParentId)。通过这种方式,每个评论都可以对任何深度进行评论,但数据在数据库中保持不变。

使用给定的PostId加载所有注释后,可以使用ParentId属性在内存中组装树/层次结构。

答案 2 :(得分:0)

将所有注释保留在同一个表结构中并使用相同的ID序列。然后:

  1. 使用COMMENT_DEPTH字段来指示递归级别。例如,postComment有COMMENT_DEPTH=0,其中对postComment的评论为COMMENT_DEPTH=1

  2. 还使用PARENT_COMMENT字段。对于COMMENT_DEPTH=0的评论,该值应为null,如果COMMENT_DEPTH>0,则该评论应包含父评论ID。

  3. 这甚至可以让您有多个级别的评论。此外,您可以通过以下方式获得发表评论:

    WHERE COMMENT_DEPTH=0
    

    您可以对评论A发表评论:

    WHERE PARENT_COMMENT=A.ID AND COMMENT_DEPTH=A.COMMENT_DEPTH+1