【发布时间】:2012-08-23 09:21:46
【问题描述】:
在架构层面上一直在努力解决这个问题。
我有一个可以评论的对象,我们称之为Post。每个帖子都有一个唯一的 ID。
现在我想对该帖子发表评论,我可以使用 ID 作为外键,并且每个 PostComment 都有一个与帖子相关的 ItemID 字段。由于每个帖子都有一个唯一的 ID,因此很容易分配“顶级”cmets。
但是,当我对评论发表评论时,我觉得我现在需要一个 PostCommentComment,它附加到 PostComment 的 ID。由于 ID 是按顺序分配的,因此我不能再简单地使用 ItemID 来区分评论在树中的分配位置。 IE。 Post 和 Post Comment 的 ID 可能都是“5”,因此我的外键关系无效。
这似乎可以无限进行,使用 PostCommentCommentComment 等...
解决这个问题的最佳方法是什么?我是否应该在评论中有一个名为“IsPostComment”的字段或类似的东西来知道要将 ID 附加到哪个集合?这是迄今为止我见过的最好的解决方案,但现在我觉得我需要进行递归数据库调用,这开始变得昂贵。
意思是,我得到一个Post 并得到所有的PostComments where ItemID == Post.ID && where IsPostComment == true
然后我将其作为一个集合,收集PostComments 的所有ID,并再次搜索where ItemID == PostComment[all].ID && where IsPostComment == false,然后无限重复。
这意味着我对每一层都进行了调用,如果我调用 100 个帖子,我可能会进行 1000 次 DB 调用以获取 10 层 cmets。
这样做的正确方法是什么?
【问题讨论】:
-
请不要crosspost。
-
@delnan 在浏览 META 后不确定哪个是发布此内容的正确位置。我将删除另一个帖子,因为这是更有成效的对话。
-
与 sharepoint 或特别是 sharepoint2010 无关(将这些作为标签,删除...)
-
它在 SharePoint 中使用并存储在列表中,但我认为这是一个更通用的设计主题,也就是如何在数据库中正确创建树。
-
如果是这种情况,那么您的最后一句话“如果我调用 100 个帖子,我可能会进行 1000 个 DB 调用”是低估了 :-)
标签: c# sql database-design