当我需要创建新表并使用外键将其连接到其他表时?

时间:2013-09-23 13:37:53

标签: mysql sql

我有这张桌子:

idFilmAward   Name
--------------------------------
1             Academy Awards
2             Saturn Award
..            ...

让我们说我也有这张表:

###############
###First Way###
###############
idAward       Name            idFilmAward
------------------------------------------
1             Best Director   1
2             Best Director   2
..            ....            ..
100           Best Actor      1

让我们在“第一路”中说“最佳导演”只重复了两次,这意味着我不需要使用“第二条道路”:

################
###Second Way###
################
idAward       idAwardName       idFilmAward
------------------------------------------
1             1                 1
2             1                 2
..            ....              ..
100           2                 1

idAwardName   Name              idAward
-------------------------------------------
1             Best Director     1
2             Best Actor        2
...           ...               ...

但是让我们说“最佳导演”重复100次,然后我需要使用“第二条道路”,对吗?我的问题是,有多少重复可以使用“第一道路”,经过多少次重复我应该使用“第二道路”?

4 个答案:

答案 0 :(得分:2)

严格地说,Database Normalization说你应该总是使用第二种方式。

您应避免在“完美”关系数据库设计中的不同行中重复相同的数据。通过这种方式,如果您想将奖项的名称从“最佳导演”更改为“最佳高级导演”,您应该更新许多行(第一种方式)和一行(第二种方式)。

但是在使用雪花设计的数据仓库设计中,第一种是最好的方式。

答案 1 :(得分:1)

这不是重复多少次的问题。必须对数据库进行标准化(至少是第三范式)。所以“如果它重复甚至一次”或更好“可以重复”在你的情况下使用一个单独的表。 (这不是一个概念)

当您不需要规范化数据库时,其中一个孤立的情况是对大量数据使用性能关键操作时,在这种情况下,非规范化数据库将实现更快(更好)的结果。

答案 2 :(得分:1)

我认为你应该在重复情况发生的任何时候使用第二种方式。因为它看起来像字典 - 它是数据库规范化的第3种常规形式

答案 3 :(得分:1)

我的直觉反应是,这是过早的优化。目前,您可能没有足够使用这个数据库,因为它对您存储数据的方式很重要(它不会对您的服务器产生太大影响等),数据库本身也不会阻止您重复数据库的重复次数。你喜欢。

那就是说,我会有以下内容:

  • 具有身份证号和姓名的获奖者表
  • 一个带有id的奖励表,一个awardgiver_id(引用AcademyAwards等)和一个名字
  • 包含award_id和film_id的award_recipient表。

原因是并非所有仪式都有相同的奖项。因为从不同的仪式中分出不同的奖项和名字对我来说是合乎逻辑的。