最有效的博客数据库设计(帖子和评论)

时间:2010-08-16 19:09:17

标签: database database-design

设计数据库来存储博客帖子和评论的最佳方法是什么?我目前正在考虑一个表格用于帖子,另一个用于评论,每个表格都有一个帖子ID。

然而,在我看来,通过一个大的评论表来搜索相关帖子的内容会很昂贵,并且每次加载博客文章时都会这样做(可能需要一些缓存)。

有更好的方法吗?

5 个答案:

答案 0 :(得分:18)

  然而,在我看来,在一个大的评论表中搜寻

所有数据库供应商都同意您的观点。

他们提供“索引”来限制这一点。

答案 1 :(得分:14)

您用于实施博客的每个数据库系统都将使用索引。这意味着,您的数据库系统不是“在大型桌子中拖网”,而是维护一个单独的评论列表以及与之关联的帖子,就像书后面的索引一样。这允许数据库系统非常快速地加载与帖子相关的评论,并且我认为您提出的任何规模的博客设计都没有任何问题。

索引通常用于将表与数百万行关联到具有数百万行的其他表 - 您必须拥有一个特别大的博客才能要求对注释进行非规范化,甚至,缓存可能会比非正规化更好地为您服务数据库。

您需要在评论表中定义索引,并将其与包含帖子ID的任何列相关联。如何完成取决于您正在使用的数据库系统。

答案 2 :(得分:7)

尝试这样的事情:

Blog
BlogID     int auto number PK
BlogName   string
...

BlogPost
BlogPostID   int auto number PK
BlogID       int FK to Blog.BlogID, index
BlogContent  string
....

Comment
CommentID       int auto number PK
BlogPostID      int FK to BlogPost.BlogPostID, index   
ReplyToCommentID int FK to Comment.CommentID  <<for comments on comments
...

答案 3 :(得分:1)

  拖着一张大桌子拖着   评论找到那些   相关的帖子很贵,

索引始终在那里拯救你! postId上的第一个索引和commentdate(desc)

中的另一个索引

答案 4 :(得分:1)

好的,我们来看看。

  

在一个大的评论表中搜寻以找到相关帖子的评论费用很贵

为什么你觉得它很贵?因为您可能认为每次花费O(n)时间就会进行线性搜索。对于10亿条评论,将完成10亿次迭代。

现在假设为comment_ID构造了二叉搜索树。要查找任何评论,您需要log(n)时间[base 2]。因此,即使是10亿条评论,也只需要大约32次迭代。

现在考虑稍微修改一下BST,其中每个节点包含k个元素而不是1个(在列表中)并且具有k + 1个子节点。此数据结构中也遵循BST的相同属性。我们在这里得到的是一个B树。更多阅读:GeeksForGeeks - B Tree Introduction

对于B树,查找时间是log(n)[base k]。因此,如果k = 10,对于10亿个条目,将只需要9次迭代。

所有数据库都保存B-Trees中主键的索引。因此,所述任务并不昂贵,您应该继续按照它看似显而易见的方式设计数据库。

PS:您可以在表的任何列上构建索引。默认情况下,已存储主键索引。但是要小心,不要在占用磁盘空间时制作不必要的索引。