1

在架构层面上一直在努力解决这个问题。

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

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

然而,当我对评论发表评论时,我觉得我现在需要一个 PostCommentComment,它附加到 PostComment 的 ID。由于 ID 是按顺序分配的,因此我不能再简单地使用 ItemID 来区分评论在树中的分配位置。IE Post 和 Post Comment 的 ID 可能为“5”,因此我的外键关系无效。

这似乎可以无限持续下去,PostCommentCommentComment 等......

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

意思是,我得到一个Post并得到所有的 PostCommentswhere ItemID == Post.ID && where IsPostComment == true

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

这意味着我对每一层都进行调用,如果我调用 100 个帖子,我可能会进行 1000 次 DB 调用以获得 10 层评论。

这样做的正确方法是什么?

4

3 回答 3

3

我只会有一张名为Post.

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

帖子将具有 ID、帖子内容以及您需要的任何其他字段。它还将有一个 ParentPostID,它是nullable和外键的 to PostID。如果ParentPostIDnull,您就知道它是原始帖子。如果有家长,您就知道该帖子是评论。这使您可以根据需要将注释嵌套得尽可能深。

于 2012-08-28T19:58:59.687 回答
1

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

所有 PostComments 都有一个 PostId,因此当您加载该帖子的评论时,您只需通过 PostId 进行查询。

所有评论也有 ParentId,它指向另一个评论(顶级评论不会有 ParentId)。这样,每条评论都可以有任何深度的评论,但数据在数据库中保持不变。

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

于 2012-08-28T19:56:41.703 回答
0

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

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

  2. 也使用一个PARENT_COMMENT字段。对于具有的评论,它应该为 nullCOMMENT_DEPTH=0并且它应该包含父评论 ID if COMMENT_DEPTH>0

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

WHERE COMMENT_DEPTH=0

您可以通过以下方式对评论 A 发表评论:

WHERE PARENT_COMMENT=A.ID AND COMMENT_DEPTH=A.COMMENT_DEPTH+1
于 2012-08-28T20:03:24.613 回答