如果引用了所有列,外键是否会减少冗余?

时间:2010-12-14 20:33:42

标签: sql database database-design normalization

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

例如,如果我有一个引用Genre表的Video表,那么Genre表很可能只有一个列有十几个相当静态的值,比如'Horror''Sci-Fi''Romance'等。

在这种情况下,是否会节省任何空间来分隔两者,或者是唯一的好处,以便您可以从一个地方更新所有引用行?

10 个答案:

答案 0 :(得分:3)

对,节省空间是 ONE 的好处,而不是唯一的好处。

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

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

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

答案 1 :(得分:2)

节省空间是分离2个表的一个好处。就像之前所说的那样,将Genre_ID替换为“恐怖”或“冒险”之类的实际值可以节省空间。

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

总之,不要担心引用所有列的事实,特别是如果表的列很少。如果您决定添加ID字段,或者只将1列表保留为“可接受的值”列表,那么您的目标应该是首先强制执行完整性,并节省空间或I / O成本。

答案 2 :(得分:0)

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

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

在大多数db中,INT将小于Varchar2(20)

答案 3 :(得分:0)

是的,如果你有一个你在视频表中使用的代理键(int)而不是varchar(20)或者genra将会是什么,它将节省空间。

答案 4 :(得分:0)

但是你在那里遇到了问题:

  

单列有十几个公平   静态值,如'恐怖''Sci-Fi'   '浪漫'等。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

Data modification anomalies

  • 如果添加新类型怎么办?
  • Sci-Fi和SciFi一样吗?
  • Sci-Fi和Sci-fi一样吗?

如果您使用另一张桌子,比如说具有相同类型的“书籍”,情况会变得更糟。

答案 8 :(得分:0)

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

标准化通常会使设计应该有效地转换为存储 - 但这实际上取决于DBMS的功能,而不是标准化中隐含的内容。

答案 9 :(得分:-1)

你也会保存,因为'Horror'在Unicode中需要12个字节,而GenreId可以是Byte或char(1)。

相关问题