【问题标题】:Normalizing Two Column Table规范化两列表
【发布时间】:2012-01-03 23:48:26
【问题描述】:

我正在尝试规范化数据库,我们目前有一个名为 BOOK 的表,其中 ISBN (FK) 和 CoverType 是列,它们连接在一起形成一个 PK。

即

BOOK

|       ISBN       |  CoverType  |
|__________________|_____________|
|  978-0132354790  |   Hardback  |
|  978-0132354790  |   Paperback | 

这个表是否已经规范化了?我假设它是,但我并没有太多的理由。 谢谢

【问题讨论】:

    标签: database database-normalization


    【解决方案1】:

    正如您在帖子中所说,BOOK(ISBN, COVERTYPE) 已标准化,因为您的所有字段都是单值的,并且主键的任何部分都不能从它的子集派生(例如,您无法判断哪些是可能的)只需查看 ISBN 本身即可为 ISBN 提供 CoverTypes,反之亦然。

    【讨论】:

      【解决方案2】:

      假设将添加更多行,您可以预期“Hardback”和“Paperback”之类的值将会重复。将它们移动到单独的表(例如“CoverType”)并加入 ID 是否有意义?

      【讨论】:

        【解决方案3】:

        这个表是否已经规范化了?

        首先是警告,然后是答案。

        注意事项

        关系建模中的某些术语具有非常具体的含义。 Normalized 不是其中之一,至少当有人以您的方式使用它时不会。

        问“这个表在 3NF 中吗?”或“这个表在 5NF 中吗?”是有道理的,但问它是否被规范化是没有意义的。仅在 SO 上,您就可以找到“这是规范化”意味着的答案

        • 在 3NF 中
        • 在 5NF 中
        • 它有一个 ID 号
        • 少于 20 列
        • 所有文本都已替换为 ID 号

        只有前两个有意义。其余的和规范化一点关系都没有。

        最后,我的回答

        我假设您的数据是有意义的。我从来没有比会计级别更详细地处理书籍,所以我从来不需要知道 ISBN 和封面类型是如何协同工作的。

        你可以像这样构建你的桌子。

        create table books (
          isbn varchar(13) not null,
          cover_type varchar(10) not null,
          primary key (isbn, cover_type)
        );
        

        如果您这样做,您将没有非主要属性(所有列都是至少一个候选键的一部分),因此您至少处于 2NF 中。没有传递依赖,因此您至少处于 3NF 中。没有多值依赖,所以至少 4NF。完全没有连接依赖,所以你处于 6NF 或“终极范式”。

        在现实生活中,您可能希望对这些列进行更多限制。我会推荐至少两个。

        1. “cover_type”上的检查约束或外键约束。
        2. 计算并比较“isbn”上的校验位。

        如果您只是导入,您可以编写一个外部程序在导入之前验证校验位。

        【讨论】:

          【解决方案4】:

          我不确定什么是不规范化的......

          如果还有什么我不知道,但就我所见,它看起来不错。

          【讨论】:

            【解决方案5】:

            实际上,这张桌子上没有太多需要标准化的东西。你没有冗余,也没有关系。看起来不错。

            【讨论】:

              猜你喜欢
              • 2013-06-04
              • 2020-12-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-25
              • 1970-01-01
              • 2021-07-11
              • 1970-01-01
              相关资源
              最近更新 更多