【问题标题】:Most efficient database design for a blog (posts and comments)最有效的博客数据库设计(帖子和评论)
【发布时间】:2011-03-30 14:43:36
【问题描述】:

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

然而,在我看来,通过大量 cmets 查找相关帖子的内容会很昂贵,并且每次加载博客帖子时都会完成(可能需要一些缓存)。

有没有更好的办法?

【问题讨论】:

  • “最佳方式”?最小的?大多数使用Oracle特性?在这种情况下,“最佳”是什么意思?
  • @S. Lott:我投票赞成“最常使用 Oracle 特性”。功能越多越好! :P
  • 有点离题,但相关:如果您不想经历制作自定义系统的麻烦,您可以使用预制系统,例如 disqus.com 用于 cmets

标签: database database-design


【解决方案1】:

然而,在我看来,在一大堆 cmets 中拖网

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

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

【讨论】:

    【解决方案2】:

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

    索引通常用于将具有数百万行的表与具有数百万行的其他表相关联 - 您必须拥有一个非常大的博客才能要求对 cme​​ts 进行非规范化,即使如此,缓存可能比非规范化更好地为您服务数据库。

    您需要在 cmets 表上定义一个索引,并将其与包含 Post ID 的任何列相关联。具体如何完成取决于您使用的数据库系统。

    【讨论】:

      【解决方案3】:

      试试这样的:

      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
      ...
      

      【讨论】:

        【解决方案4】:

        好的,让我们看看。

        在一大堆 cmets 中寻找相关职位的内容会很昂贵

        为什么你认为它会很贵?因为您可能认为每次都会花费 O(n) 时间进行线性搜索。对于十亿个 cmets,将进行十亿次迭代。

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

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

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

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

        PS:您可以在表的任何列上建立索引。默认情况下,主键索引已经存储。但请注意,不要创建不必要的索引,因为它们会占用磁盘空间。

        【讨论】:

          【解决方案5】:

          在一张大桌子上拖网 cmets 找到那些 相关的帖子会很昂贵,

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

          【讨论】:

            猜你喜欢
            • 2012-08-22
            • 2012-04-19
            • 2016-09-24
            • 2015-04-17
            • 2016-11-01
            • 1970-01-01
            • 2017-10-04
            • 1970-01-01
            • 2021-01-18
            相关资源
            最近更新 更多