2015-04-28 40 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)。 –