0

我有这张桌子:

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

4 回答 4

2

严格来说,数据库规范化说您应该始终使用第二种方式。

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

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

于 2013-09-23T13:45:41.673 回答
1

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

不想要规范化数据库的孤立情况之一是对大量数据使用性能关键操作时,在这种情况下,非规范化数据库将获得更快(更好)的结果。

于 2013-09-23T13:43:44.223 回答
1

我认为您应该在可能发生重复情况的任何时候使用第二种方式。因为它看起来像一本字典——它是数据库规范化的第三种正常形式

于 2013-09-23T13:44:46.973 回答
1

我的直觉反应是,这是过早的优化。目前,您可能没有足够地使用此数据库,以至于您存储数据的方式很重要(它不会对您的服务器等产生重大影响),并且数据库本身不会阻止您进行尽可能多的重复你喜欢。

也就是说,我将拥有以下内容:

  • 带有 id 和 name 的获奖者表
  • 带有 id、awardgiver_id(引用 AcademyAwards 等)和名称的奖项表
  • 带有award_id 和film_id 的award_recipient 表。

原因是并非所有仪式都有相同的奖项列表。而且因为对我来说,将不同的奖项和他们的名字从不同的仪式中分离出来是合乎逻辑的。

于 2013-09-23T13:46:09.750 回答