Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可评论评论评论的适当数据结构_C#_Sql_Database Design - Fatal编程技术网

C# 可评论评论评论的适当数据结构

C# 可评论评论评论的适当数据结构,c#,sql,database-design,C#,Sql,Database Design,在架构层面上一直在努力解决这个问题 我有一个可以评论的对象,我们称之为帖子。每个帖子都有一个唯一的ID 现在我想对这篇文章发表评论,我可以使用ID作为外键,每个PostComment都有一个与文章相关的ItemID字段。因为每个帖子都有一个唯一的ID,所以很容易分配顶级评论 然而,当我对一条评论发表评论时,我觉得我现在需要一条PostCommentComment评论,它附加到PostComment的ID上。由于ID是按顺序分配的,我不能再简单地使用ItemID来区分注释在树中的分配位置。也就是说

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

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

现在我想对这篇文章发表评论,我可以使用ID作为外键,每个PostComment都有一个与文章相关的ItemID字段。因为每个帖子都有一个唯一的ID,所以很容易分配顶级评论

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

这似乎可以无限地继续下去,如PostCommentCommentCommentComment的评论等

解决这个问题的最好办法是什么?我是否应该在注释中有一个名为IsPostComment或类似的字段,以了解将ID附加到哪个集合?这是迄今为止我见过的最好的解决方案,但现在我觉得我需要进行递归数据库调用,这会变得越来越昂贵

也就是说,我得到一个Post并得到所有Post命令,其中ItemID==Post.ID&&IsPostComment==true

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

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


做这件事的正确方法是什么?

我想说的是,你只需要发表后评论,而不是发表后评论或其他任何东西

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

所有注释也都有ParentId,它指向另一个注释顶级注释将没有ParentId。这样,每个注释都可以有任何深度的注释,但数据在数据库中保持平坦


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

我想说的是,您只需要PostComment,而不是PostCommentComment或其他任何内容

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

所有注释也都有ParentId,它指向另一个注释顶级注释将没有ParentId。这样,每个注释都可以有任何深度的注释,但数据在数据库中保持平坦


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

我只有一个表,名为Post


帖子将包含和ID、帖子内容以及您需要的任何其他字段。它还将有一个ParentPostID,可以为null,并且外键为PostID。如果ParentPostID为null,您就知道它是原始post。如果有家长,你知道这篇文章是一篇评论。这允许您将注释嵌套到所需的深度。

我只有一个表,名为Post


帖子将包含和ID、帖子内容以及您需要的任何其他字段。它还将有一个ParentPostID,可以为null,并且外键为PostID。如果ParentPostID为null,您就知道它是原始post。如果有家长,你知道这篇文章是一篇评论。这允许您将注释嵌套到所需的深度。

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

使用COMMENT_DEPTH字段指示递归级别。例如,一个postComment的COMMENT_DEPTH=0,其中postComment上的COMMENT的COMMENT_DEPTH=1

还可以使用父注释字段。对于注释深度为0的注释,该值应为null,如果注释深度>0,则该值应包含父注释ID

这甚至可以让你有多层次的评论。此外,您可以通过以下方式获得帖子评论:

WHERE COMMENT_DEPTH=0
您可以通过以下方式对评论a进行评论:

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

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

使用COMMENT_DEPTH字段指示递归级别。例如,一个postComment的COMMENT_DEPTH=0,其中postComment上的COMMENT的COMMENT_DEPTH=1

还可以使用父注释字段。对于注释深度为0的注释,该值应为null,如果注释深度>0,则该值应包含父注释ID

这甚至可以让你有多层次的评论。此外,您可以通过以下方式获得帖子评论:

WHERE COMMENT_DEPTH=0
您可以通过以下方式对评论a进行评论:

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

虽然我在数据库设计方面没有太多经验,但这几乎正是我所想的。不过,我在想,为什么不同时存储哪个注释线程ID和每个注释的DepthInThread int呢?这样你就不必对评论进行排序了
在内存中,可以直接将它们推送到站点中。@RobertChrist如果这种优化对您的系统有效,当然可以。如果一个评论有一个父、子和孙子,那它属于什么样的线程ID呢?它们都属于原始评论吗?知道孙子属于线程可能不足以避免内存排序;您仍然需要解析它应该出现在哪个父级下。此外,如果您使用类似DepthInThread的内容,您应该考虑如果删除/标记/删除注释,那么序列中可能会出现空白。这几乎正是我所想的,尽管我在数据库设计方面没有太多经验。不过,我在想,为什么不同时存储哪个注释线程ID和每个注释的DepthInThread int呢?这样,您甚至不必在内存中对注释进行排序,只需将它们直接推送到站点即可。@RobertChrist如果这种优化对您的系统有效,当然可以。如果一个评论有一个父、子和孙子,那它属于什么样的线程ID呢?它们都属于原始评论吗?知道孙子属于线程可能不足以避免内存排序;您仍然需要解析它应该出现在哪个父级下。此外,如果您使用类似DepthInThread的内容,您应该考虑到如果删除/标记/删除某条评论,可能会在序列中出现空白。请不要这样做。@delnan不确定在浏览META后在哪个位置发布此内容。我将删除另一篇文章,因为这是一个更高效的对话框。与sharepoint无关,特别是sharepoint2010将这些作为标记,删除…它正在sharepoint中使用并存储在列表中,但我认为这是一个更通用的设计主题,即如何在数据库中正确创建树。如果是这样,那么你的最后一句话,如果我打100个帖子,我可能会打1000个分贝的帖子,这是一个低估:-请不要这么做。@delnan不确定在冲浪后哪个地方发这个帖子是正确的。我将删除另一篇文章,因为这是一个更高效的对话框。与sharepoint无关,特别是sharepoint2010将这些作为标记,删除…它正在sharepoint中使用并存储在列表中,但我认为这是一个更通用的设计主题,即如何在数据库中正确创建树。如果是这样,那么你的最后一句话,如果我打100个帖子,我可能会打1000个分贝的电话,这是一个低估:-