数据库:哪种架构更有效率?

时间:2016-01-26 22:17:13

标签: sql database database-design database-normalization

哪种方法最好?它们都已标准化,但这个选项让我感到困惑。

第一种方法

这种方法的空数据较少,但会更加分散。它只保存在每张桌子上尝试,踢或被驱逐的玩家。

变种

MatchPlayer(matchId, playerId)
Try(matchId, playerId, tries)
Kick(matchId, playerId, conversions, failedConversions, dropGoals)
Card(matchId, playerId, yellow, red)

变体二

MatchPlayer(id, matchId, playerId)
Try(matchPlayerId, tries)
Kick(matchPlayerId, conversions, failedConversions, dropGoals)
Card(matchPlayerId, yellow, red)

第二种方法

这种方法将有空数据,但分工较少。它仅保存在MatchStats得分或被开除的球员。

变种

MatchPlayer(matchId, playerId)
MatchStats(matchId, playerId, tries, conversions, failedConversions, dropGoals, yellow, red)

变体二

MatchPlayer(id, matchId, playerId)
MatchStats(matchPlayerId, tries, conversions, failedConversions, dropGoals, yellow, red)

第三种方法

这种方法将有更多的空数据,但分割得更少。即使玩家没有得分或被驱逐,它也会将所有数据保存为零。

MatchPlayer(matchId, playerId, tries, conversions, failedConversions, dropGoals, yellow, red)

第四种方法

这种方法根本没有空数据,但会更加分散。

变种

MatchPlayer(matchId, playerId)
Try(matchId, playerId, tries)
Conversion(matchId, playerId, conversions)
FailedConversion(matchId, playerId, failedConversions)
DropGoal(matchId, playerId, dropGoals)
YellowCard(matchId, playerId, yellow)
RedCard(matchId, playerId, red)

变体二

MatchPlayer(matchPlayerId, matchId, playerId)
Try(matchPlayerId, tries)
Conversion(matchPlayerId, conversions)
FailedConversion(matchPlayerId, failedConversions)
DropGoal(matchPlayerId, dropGoals)
YellowCard(matchPlayerId, yellow)
RedCard(matchPlayerId, red)

你有什么看法?

2 个答案:

答案 0 :(得分:1)

我会选择Second Approach,Variant 1.如果你只在每次比赛后为每个玩家添加数据,那么稍后查询,将所有数据放在一个表中将使大多数查询更简单(以及整体数据库结构)。

虽然其他方法可能在设计上更好,但多表连接只会令人讨厌。

但是,我会为匹配中的每个玩家添加一行(尝试的值为0等)。这将确保您在编译统计信息时不必将它们视为特殊情况。当然,这将取决于实际查询以及您如何编写它们,因此请将其视为一种选择。

请注意,此建议基于直觉,对实际应用的了解有限。

答案 1 :(得分:1)

第三种方法似乎是合理的 - 它是一个关系表,其中包含描述关系的属性。您有关系的复合键,并且只要关系存在,您的属性就会有预期的值。

就效率而言,您的表格并不是特别宽,因此扫描表格以计算汇总统计数据的效率不会受到影响。对于诸如以下的查询,所有方法都具有类似的性能:

  • 列出比赛中所有球员的统计数据
  • 列出球员比赛的统计数据

这些查询将依赖于每种情况下关系表的索引,并查找连接的表。给定每个匹配或每个玩家的结果可能会出现的行数,这些联接并不重要。但是,如上所述,第三种方法在保持适当的标准化水平的同时消除了对任何连接的需要。