【问题标题】:Basic database design : list of instances of type基本数据库设计:类型实例列表
【发布时间】:2015-04-30 10:29:21
【问题描述】:

这是一个关于数据库设计的初学者问题。假设我们有一个有很多用户的博客网站,每个用户都有几篇博客文章。我们希望快速找到给定用户撰写的所有文章。我们可以在帖子表中搜索具有给定用户 ID 的所有博客帖子。我们还可以将用户表设计为包含用户帖子的列表。这可能意味着存储一串逗号分隔的帖子 ID。这样做的正确方法是什么?

【问题讨论】:

    标签: database-design


    【解决方案1】:

    您正在寻找database normalization,这是一种防止:

    • 冗余(多次存储相同的数据)
    • 异常(改变一个数据会改变另一个)
    • 循环(改变 A 改变 B 改变 C 改变 A)
    • 重新设计(添加或删除字段需要更改其他字段)
    • 偏见(问同一个问题的不同方式给出不同的答案)

    规范化的典型形式称为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
    

    这种设计可以从用户那里获取文章,或者从文章中获取用户,从数据库命令中获取。

    【讨论】:

    • 感谢拱门。我有另一个问题。我假设数据库在主键上实现了红黑树,但是其他列呢?通过 userID 的第二列搜索文档表的效率如何?
    • 完全取决于您使用的数据库技术。大多数都允许在不影响数据的情况下调整查找性能。
    • @user442920 关系数据库通常不使用红黑树 - 它们适用于内存操作,但与数据库页面(本质上是磁盘分配单元)对齐不佳。相反,B 树几乎被普遍使用。是的,您可以在同一张表的顶部有多个 B 树索引(在这种情况下,您可以在 userID 上拥有索引)。为了更好地理解,我强烈建议您阅读Anatomy of an SQL Index(以及几乎整个use-the-index-luke.com 网站)。
    • @user442920 只是为了澄清 Dour 的回答:存储列表是“错误的”,因为它违反了 atomicity 的原则,因此违反了 1NF。与设计良好的索引方案相比,它会损害您的数据完整性(这通常比性能更重要)并最终也会损害您的性能。
    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多