第二范式/标准化混淆:主键?复合键?

时间:2014-02-25 13:26:41

标签: database database-design database-normalization

我正在制作一个数据库计划,我对规范化到第二范式有点困惑。我也担心大量的栏目,我无法正确地弄清楚如何处理它们。

这是我的表格,我专注于MatchDetails

想法1

Attempt with Compound Key

img link

Player_ID是另一个表Users的唯一主键。 MatchID是表Matches的唯一主键。匹配和玩家之间的关系是多对多的。

这可以作为复合键吗?从某种意义上说,一名球员只能参加一次特定的比赛? MatchID右侧的列是否具有复合键的功能依赖性,因为它们对于该复合键是唯一的?

创意2

Table with Primary Key img link

在此示例中,Participation_ID是表的唯一主键,因为对于各种播放器组合,可能存在相同Player_ID和相同MatchID的多个实例匹配。

在这个例子中,我猜这个列是第二范式,因为只有一个主键,匹配值是唯一的,因此在功能上依赖?尽管我试图阅读它here,但我对功能依赖有点困惑。

哦,还有一件小事......

我有点怀疑的最后一件事是大量的专栏。 MatchID右侧的所有信息都是有关玩家(Player_ID)在比赛(MatchID)中的表现的详细信息。他们应该在另一张桌子上吗?

如果您想查看到目前为止的布局,请链接到其他表:http://i.imgur.com/52ax04g.png

请忽略MatchID没有下划线和其他ID,这只是一个excel计划!

2 个答案:

答案 0 :(得分:2)

列{PlayerID,MatchID}似乎作为复合键。

MatchID右侧的列确实具有对(复合)主键的功能依赖性,只要它们在一个特定匹配中表示该玩家的统计信息即可。

如果这些列代表玩家的整体统计数据,那么他们只依赖于PlayerID,并且此设计不在2NF中。

普通表单会考虑每个候选键,而不仅仅是主键。您稍后添加整数行标识符ParticipationID的事实在我之前的段落中不会更改任何 - 列{PlayerID,MatchID} 仍然似乎是一个(复合)候选键,你必须考虑它们。

没有"我没有太多的专栏"正常形式。如果您需要20个功能上依赖于每个候选键的属性,那么您需要20个在功能上依赖于每个候选键的属性。

答案 1 :(得分:2)

除非同一个玩家可以多次参与同一场比赛,否则您必须拥有一个复合键{Player_ID,MatchID},无论您是否添加另一个键(例如{Participation_ID} )或不。

添加{Participation_ID}键只有在你有一些引用它的其他表 1 并且你想让它们的外键变细,或者如果你使用一个特别恶劣的需要非ORM的ORM时才有意义 - 复合主键。

  

MatchID右侧的列是否具有复合键

的功能依赖性

您可以将“功能依赖”简单地视为表示关系(一组元组)是函数的一种方式。对于一个关系是函数(在该词的数学意义上),它必须总是为相同的“参数”产生相同的“结果”。

如果给定键的属性是“参数”而其余属性是“结果”,则不能从相同的参数生成两个不同的结果,因为键是唯一的,因此任何关键属性值 2 的特定组合不能识别多个元组。

因此,所有属性始终在功能上依赖于键。任何密钥都是如此,否则它就不是关键。

唯一的问题是某些非关键属性是否依赖于关键属性的正确子集。如果是,则违反了2NF。 3

在您的情况下,如果任何属性依赖于Player_ID 单独(或单独使用MatchID),则会违反2NF。

  

我有点怀疑的最后一件事是大量的专栏。 MatchID右侧的所有信息都是关于玩家(Player_ID)在匹配中执行的详细信息(MatchID)。他们应该在另一张桌子上吗?

逻辑的角度来看,他们看起来就像是他们需要的地方。您可能有{em>物理原因导致vertically partitioning数据。 4

一些不相关的建议:

  • 使用一致的命名:如果有Player_ID,则应该有Match_ID,而不是MatchID(或反之亦然)。 Whops,我错过了你的最后一句话。
  • 对表名使用单数,出于同样的原因,单数通常用于OOP中的类名。

1 我认为你没有这么做。

2 Aka。 “素数”属性。奇怪的是,一个主要属性不必属于“主”键(它可以属于一个备用键),所以只说“关键属性”可能是一个更好的术语,恕我直言。

3 显然,这只是复合键的一个问题,因为如果一个键只有一个属性,那么它的正确子集是空的。

4 DBMS目前通常可以处理数百甚至数千个列,而这并不符合“大量列”的要求。