【问题标题】:Does a foreign key reduce redundancy if all the columns are referenced?如果引用了所有列,外键是否会减少冗余?
【发布时间】:2011-05-25 13:01:11
【问题描述】:

我读到规范化的好处之一是减少数据库中的冗余。但我想知道,如果您最终引用了目标表中的所有列?

例如,如果我有一个引用流派表的视频表,流派表很可能只有一列,其中包含十几个相当静态的值,例如“恐怖”“科幻”“浪漫”等。

在这种情况下,将两者分开是否节省了空间,还是这样做的唯一好处是您可以从一个地方更新所有引用行?

【问题讨论】:

  • 用其他值替换值,这些值是 ids 加上一个从旧到新的查找表不是规范化。规范化到 1NF 重新排列表以删除嵌套值以简化查询和规范化到更高的 NFs 通过投影替换表以避免以不受控制的方式多次记录同一事物。

标签: sql database database-design normalization


【解决方案1】:

没错,节省空间是一个的好处,而不是唯一的好处。

在你提到的情况下,不,如果你使用那一列作为PK,你不会节省空间。

您可以使用自动编号/序列来抽象该表并将其用作 PK,并使当前列成为候选键(因此它保持唯一)。

但是按照您的概述完全保留您的设计,其好处在于一致性。您将只有这 12 个值...您不会意外输入“Horrer”或“PSY-Fi”的值

【讨论】:

  • 很多很好的答案。感谢大家!可怜的 Joe Celko 会为这里的所有代理追随者感到羞愧:D 你得到我的投票,斯蒂芬妮,因为你仔细阅读了我的问题,并迅速而清晰地回答。
  • 谢谢。我认为程序员型的人把规则推向了极端……总是做x,这意味着永远永远阿门。但我认为你需要理解为什么人们说总是做 x,因为那样你就会知道为什么不做。
【解决方案2】:

节省空间是将两张表分开的好处之一。如前所述,将 Genre_ID 替换为“恐怖”或“冒险”等实际值将节省空间。

在我看来,这样做是为了加强完整性。如果您将文本值放入视频表中,是什么防止您意外更改值?现在有些行可能有“冒险”或“动作/冒险”等等。通过拥有 2 个表并使用外键引用,您将更好地控制哪些值可以是一种类型。

总而言之,不必担心您引用了所有列,尤其是在表的列很少的情况下。如果您决定添加一个 ID 字段,或者只是将 1 列表保留为“可接受值”列表,那么您的目标应该是首先强制执行完整性,其次是节省空间或 I/O 成本。

【讨论】:

  • 我希望我能将您的答案投第二票。你回答得更早了,但斯蒂芬妮的回答更清楚一点——我马上就知道,不,在我描述的情况下,FK 不会节省空间。
  • Stephanie 的回答确实更清晰、更快速。这就是我一直阅读教科书的收获!
【解决方案3】:

我会使用代理键(自动编号、身份等)并将其用于外键连接而不是实际值。

这个想法更多的是关于数据质量而不是减少空间。

在大多数数据库中,INT 会小于 Varchar2 (20)

【讨论】:

    【解决方案4】:

    是的,如果您在视频表中使用代理键 (int) 而不是 varchar(20) 或任何 genra,它将节省空间。

    【讨论】:

      【解决方案5】:

      但是你自己也遇到了问题:

      单列一打相当 静态值,例如“恐怖”“科幻” '浪漫'等。

      使用代理键和规范化表,您只在数据库中存储一次“恐怖”,但它的 ID 号存储在多个位置(一个简单的数字大部分时间都小于文本,并且确实节省空间)。它不仅增加了数据库的可维护性,而且确实节省了原始空间。

      【讨论】:

      • 他使用这些值作为 PK。他说引用所有的列......在这种情况下是唯一的列。
      【解决方案6】:

      如果您想确保 Video 表中的行具有有效/预定的 Genre 条目,会发生什么?如果您没有外键约束,您将需要 Video 表中该列的枚举,然后每次添加新流派时都必须更改架构,而不仅仅是向流派表添加新行。

      【讨论】:

      • 我从来不知道 enum 是一个 SQL 结构。这是哪个 ANSI SQL 标准?
      • 我不认为它本身就是这样:但枚举将是一种没有外键并限制值的方法。
      【解决方案7】:

      在这种情况下,您的键值加上它们的索引可能比数据本身大得多。执行类似这样的简单代码的另一种模型是有一个代码表,然后有一个插入和更新检查约束来验证它们。这也避免了为了获取流派数据而进行的连接。您采用哪种方式有点不确定,这取决于您的应用程序查询往往是什么。

      【讨论】:

        【解决方案8】:

        Data modification anomalies

        • 如果添加新类型会怎样?
        • 科幻和科幻一样吗?
        • 科幻和科幻一样吗?

        如果您使用另一个表,例如具有相同流派的“书籍”,情况会变得更糟。

        【讨论】:

          【解决方案9】:

          规范化与节省空间无关。这是关于消除由于某些冗余而可能发生的潜在异常。由于规范化只定义了逻辑级别,因此规范化的数据库很可能在物理上比非规范化或非规范化的数据库更大或更小。

          确实,规范化通常使设计应该有效地转化为存储 - 但这实际上取决于 DBMS 的特性,而不是规范化中隐含的东西。

          【讨论】:

            【解决方案10】:

            您还可以保存,因为“恐怖”在 Unicode 中占用 12 个字节,而 GenreId 可以是 Byte 或 char(1)。

            【讨论】:

            • 字节?字符?当查找超过 255 个值时会发生什么?
            • @Raj More:然后你使用整数或其他任何东西,但无论如何都有好处。你自己能找到吗?
            猜你喜欢
            • 2014-08-28
            • 1970-01-01
            • 1970-01-01
            • 2012-01-07
            • 1970-01-01
            • 2017-12-01
            • 2017-01-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多