2010-08-16 96 views
9

設計數據庫以存儲博客文章和評論的最佳方式是什麼?我目前正在考慮一個職位表,另一個表達意見,每個職位都有一個職位ID。最有效的博客數據庫設計(帖子和評論)

然而,在我看來,通過大量的評論表來查找相關帖子的內容會很昂貴,並且每次加載博客文章(可能包含一定量的緩存)都會完成。

有沒有更好的方法?

+0

可能重複[MYSQl優化表的博客文章與評論](http://stackoverflow.com/questions/3297583/mysql-optimize-table-of-blog-posts-with-comments) – 2010-08-16 19:11:09

+2

「最好的辦法」 ?最小?大部分使用Oracle功能?在這種情況下,「最好」意味着什麼? – 2010-08-16 19:12:42

+0

@S。洛特:我投票贊成「大部分使用Oracle功能」。功能越多越好! :P – FrustratedWithFormsDesigner 2010-08-16 19:17:31

回答

17

在我看來,不過,經過一大桌的意見

所有的數據庫廠商同意你拖網捕魚。

他們提供「索引」來限制這一點。

13

您將用於實現您的博客的每個數據庫系統將使用索引。這意味着,您的數據庫系統不是「通過大型表格進行拖網」,而是保持單獨的評論列表以及與其關聯的帖子,就像書後的索引一樣。這使得數據庫系統能夠非常快速地加載與帖子相關聯的評論,並且我沒有看到您爲任何規模的博客提出的設計有任何問題。

索引通常用於將表與數百萬行與包含數百萬行的其他表相關聯 - 您必須有一個特別大的博客來要求非規範化的評論,甚至緩存可能會爲您提供更好的服務反規範化數據庫。

您需要在您的評論表上定義一個索引,並將其與任何包含帖子ID的列相關聯。如何完成取決於你使用的數據庫系統。

1

通過一個大表 評論拖網找到那些爲 相關的職位將是昂貴的,

索引是永遠存在來救你!在postId第一指數和其他的commentdate(DESC)

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

好吧,讓我們來看看。

通過拖網一大桌的意見,找到那些相關的職位將是昂貴的

爲什麼你認爲它會是昂貴?因爲您可能認爲每次花費O(n)時間都會進行線性搜索。對於十億條評論,將會有十億次迭代。

現在假設爲comment_ID構造了一個二叉查找樹。要查看任何評論,您需要log(n)time [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樹中主鍵的索引。因此,所陳述的任務並不昂貴,而且您應該繼續前進,並以顯而易見的方式設計數據庫。 PS:你可以在表的任何一列上建立一個索引。默認情況下,主鍵索引已經存儲。但要小心,不要因佔用磁盤空間而造成不必要的索引。

相關問題