在建筑层面上一直在努力。
我有一个可以评论的对象,我们称之为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个注释。
正确的方法是什么?
答案 0 :(得分:2)
我只有一个名为Post
的表。
CREATE TABLE Post
(
PostID int PK,
PostContent nvarchar,
ParentPostID int FK null,
...
)
帖子将包含ID,发布内容以及您需要的任何其他字段。它还有一个ParentPostID,它是nullable
,外键是PostID
。如果ParentPostID
为null
,您就知道它是原始帖子。如果有父母,则您知道帖子是评论。这允许您根据需要嵌套注释。
答案 1 :(得分:1)
我会说你只有PostComment,而不是PostCommentComment或其他任何东西。
所有PostComments都有一个PostId,所以当您为该帖子加载评论时,只需按PostId查询。
所有评论也都有ParentId,它指向另一条评论(顶级评论不会有ParentId)。通过这种方式,每个评论都可以对任何深度进行评论,但数据在数据库中保持不变。
使用给定的PostId加载所有注释后,可以使用ParentId属性在内存中组装树/层次结构。
答案 2 :(得分:0)
将所有注释保留在同一个表结构中并使用相同的ID序列。然后:
使用COMMENT_DEPTH
字段来指示递归级别。例如,postComment有COMMENT_DEPTH=0
,其中对postComment的评论为COMMENT_DEPTH=1
。
还使用PARENT_COMMENT
字段。对于COMMENT_DEPTH=0
的评论,该值应为null,如果COMMENT_DEPTH>0
,则该评论应包含父评论ID。
这甚至可以让您有多个级别的评论。此外,您可以通过以下方式获得发表评论:
WHERE COMMENT_DEPTH=0
您可以对评论A发表评论:
WHERE PARENT_COMMENT=A.ID AND COMMENT_DEPTH=A.COMMENT_DEPTH+1