Database 第二正常形式/正常化混淆:主键?复合键?

Database 第二正常形式/正常化混淆:主键?复合键?,database,database-design,database-normalization,Database,Database Design,Database Normalization,我正在制定一个数据库计划,我对规范化为第二个标准形式有点困惑。我还担心大量的专栏,我无法正确地找出如何处理它们 这是我的表格,我关注的是MatchDetails: 想法1 Player\u ID是另一个表用户的唯一主键MatchID是表匹配项的唯一主键。比赛和球员之间的关系是多对多的 这是复合键吗?在某种意义上,一名球员只能参加一次特定的比赛?MatchID右侧的列是否对复合键具有函数依赖性,即它们对该复合键是唯一的 想法2 在本例中,Participation\u ID是表的唯一主键,

我正在制定一个数据库计划,我对规范化为第二个标准形式有点困惑。我还担心大量的专栏,我无法正确地找出如何处理它们

这是我的表格,我关注的是
MatchDetails

想法1

Player\u ID
是另一个表
用户的唯一主键
MatchID
是表
匹配项的唯一主键。比赛和球员之间的关系是多对多的

这是复合键吗?在某种意义上,一名球员只能参加一次特定的比赛?
MatchID
右侧的列是否对复合键具有函数依赖性,即它们对该复合键是唯一的

想法2

在本例中,
Participation\u ID
是表的唯一主键,因为对于不同的玩家和比赛组合,可以有相同的
Player\u ID
和相同的
MatchID
的多个实例

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

哦,还有一件小事。。。 我有点怀疑的最后一件事是大量的专栏。
MatchID
右侧的所有信息都是关于球员(
player_ID
)在比赛中如何表现的详细信息(
MatchID
)。他们应该在另一张桌子上吗

如果要查看目前的布局,请链接到其他表:


请忽略MatchID没有下划线,而另一个ID有下划线,这只是一个excel计划

列{PlayerID,MatchID}似乎是一个复合键

MatchID右侧的列确实对(复合)主键具有函数依赖性,只要它们表示某个特定比赛中该玩家的统计信息

如果这些列表示玩家的总体统计信息,那么它们只依赖于PlayerID,而这种设计不在2NF中

范式考虑每个候选密钥,而不仅仅是主键。事实上,您后来添加了一个整数行标识符ParticipationID,这并没有改变我前面几段中的任何内容——列{PlayerID,MatchID}似乎仍然是一个(复合)候选键,您必须考虑它们


没有“我没有太多列”这样的标准形式。如果您需要20个在功能上依赖于每个候选键的属性,那么您需要20个在功能上依赖于每个候选键的属性。

列{PlayerID,MatchID}似乎是一个复合键

MatchID右侧的列确实对(复合)主键具有函数依赖性,只要它们表示某个特定比赛中该玩家的统计信息

如果这些列表示玩家的总体统计信息,那么它们只依赖于PlayerID,而这种设计不在2NF中

范式考虑每个候选密钥,而不仅仅是主键。事实上,您后来添加了一个整数行标识符ParticipationID,这并没有改变我前面几段中的任何内容——列{PlayerID,MatchID}似乎仍然是一个(复合)候选键,您必须考虑它们


没有“我没有太多列”这样的标准形式。如果您需要20个在功能上依赖于每个候选密钥的属性,那么您需要20个在功能上依赖于每个候选密钥的属性。

除非同一玩家可以多次参与同一比赛,否则无论您添加另一个密钥(如{参与{u ID})或不参与

添加{Participation_ID}键只有在您有一些引用it1的其他表并且您希望使它们的外键更精简,或者如果您使用需要非复合主键的特别恶意ORM时才有意义

MatchID右侧的列是否对复合键具有函数依赖关系

你可以把“函数依赖性”简单地看作是一种表示关系(一组元组)是函数的方式。关系要成为函数(在这个词的数学意义上),它必须总是为相同的“参数”产生相同的“结果”

如果给定键的属性是“参数”,其余属性是“结果”,那么不能从同一个参数产生两个不同的结果,这仅仅是因为键是唯一的,因此键属性值的任何特定组合2不能识别多个元组

所以所有属性在功能上都依赖于键。这对于任何键都是正确的,否则它就不是键了

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

在您的情况下,如果任何属性仅依赖于Player_ID(或MatchID),则将违反2NF

我有点怀疑的最后一件事是列的数量太多。MatchID右边的所有信息都是关于球员(球员ID)在比赛中表现的详细信息。他们应该在另一个表中吗

从逻辑的角度看,它们似乎在需要的地方。不太可能,但也有可能,您对这些数据有一些物理原因。4

一些无关的建议:

  • 使用一致的命名:如果有玩家ID,应该有匹配ID,而不是M