我正在制作一个数据库计划,我对规范化到第二范式有点困惑。我也担心大量的栏目,我无法正确地弄清楚如何处理它们。
这是我的表格,我专注于MatchDetails
:
Player_ID
是另一个表Users
的唯一主键。 MatchID
是表Matches
的唯一主键。匹配和玩家之间的关系是多对多的。
这可以作为复合键吗?从某种意义上说,一名球员只能参加一次特定的比赛? MatchID
右侧的列是否具有复合键的功能依赖性,因为它们对于该复合键是唯一的?
在此示例中,Participation_ID
是表的唯一主键,因为对于各种播放器组合,可能存在相同Player_ID
和相同MatchID
的多个实例匹配。
在这个例子中,我猜这个列是第二范式,因为只有一个主键,匹配值是唯一的,因此在功能上依赖?尽管我试图阅读它here,但我对功能依赖有点困惑。
我有点怀疑的最后一件事是大量的专栏。 MatchID
右侧的所有信息都是有关玩家(Player_ID
)在比赛(MatchID
)中的表现的详细信息。他们应该在另一张桌子上吗?
如果您想查看到目前为止的布局,请链接到其他表:http://i.imgur.com/52ax04g.png
请忽略MatchID没有下划线和其他ID,这只是一个excel计划!
答案 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
一些不相关的建议:
1 我认为你没有这么做。
2 Aka。 “素数”属性。奇怪的是,一个主要属性不必属于“主”键(它可以属于一个备用键),所以只说“关键属性”可能是一个更好的术语,恕我直言。
3 显然,这只是复合键的一个问题,因为如果一个键只有一个属性,那么它的正确子集是空的。
4 DBMS目前通常可以处理数百甚至数千个列,而这并不符合“大量列”的要求。