2015-04-28 42 views
0

這是一個關於數據庫設計的初學者問題。假設我們有一個擁有許多用戶的博客網站,每個用戶都有一些博客帖子。我們希望快速查找給定用戶編寫的所有文章。我們可以使用給定的userID在帖子表中搜索所有博客文章。我們還可以設計用戶表以獲取用戶帖子的列表。這也許意味着,可能會存儲一串以逗號分隔的帖子ID。什麼是正確的方法來做到這一點?基本數據庫設計:類型實例列表

回答

3

你正在尋找database normalization,其防止技術:

  • 冗餘(存儲多於一次相同的數據更多)
  • 異常(改變一個數據改變另一個)
  • 週期數(改變A改變B改變C改變A)
  • 重新設計(添加或刪除一個字段需要改變其他字段)
  • 偏見(不同的方式詢問相同的問題給出di fferent答案)

規範化的典型形式被稱爲Boyce-Codd Normal Form並且,總體來說相當困難的事,但你可以通過實現低Normal Forms改進設計。

您還沒有給我們足夠的信息來爲您推薦架構,但如果您需要區分帖子ID,則「存儲逗號分隔的帖子ID字符串」是錯誤的。如果這是你想要的,你應該考慮設計像什麼:

Users 
userID other user fields .. 
    100 Charlie 
    101 Edith 

Articles 
articleID userID pathOrWhatever... 
    1000  100 http://example.com/stuff 
    1001  100 http://example.com/moreStuff 
    1002  101 http://example.com/somethingElse 

這樣的設計可以從用戶的文章,或者用戶的文章,從數據庫命令。

+0

謝謝Arch。我有另一個問題。我假設數據庫在主鍵上實現了紅黑樹,但其他列又如何?通過用戶標識的輔助列搜索文檔表格效率如何? – user442920

+0

完全依賴於您使用的數據庫技術。大多數允許調整查找性能而不影響數據。 –

+1

@ user442920關係數據庫通常不使用紅黑樹 - 它們適用於內存中操作,但與數據庫頁面(本質上是磁盤分配的單位)並不完全一致。相反,B樹幾乎普遍使用。是的,你可以在同一個表的頂部有幾個B-tree索引(在這種情況下,你可以在'userID'上有索引)。爲了更好地理解,我熱烈推薦閱讀[SQL索引解析](http://use-the-index-luke.com/sql/anatomy)(以及幾乎整個http:// use-the-index-就此而言,luke.com/ site)。 –