创建SQL组合键逻辑

时间:2016-01-30 16:37:30

标签: sql database-design database-normalization composite-primary-key

我正在制定数据库设计,并对创建复合ID有疑问。我坚持使用的数据库部分是一个“回合”表。

数据库的目标是存储MMA战斗的结果,以便进行统计分析。

在每场比赛中,有三名裁判得分。我认为我最好的方法是创建一个“rounds”表,每个“fightID_FK”+“fighterID_FK”+“judgeID_FK”+“roundNum”都是唯一的。我的想法是创建这4列的复合来创建一个PK。该表中唯一的另一列将是“roundScore”,这是法官在第1,2,3,4或5轮中在战斗中给予战斗机的分数。

这是最好的方法吗?有没有我不考虑的因素?

1 个答案:

答案 0 :(得分:1)

你的4栏"天然"关键是个好主意。添加("代理")id列并不能帮助约束有效值;您应该声明密钥是否添加ID。当另一个表在原始表的id上有一个FK并且具有4列中的任何一个和id的值时,这些列也必须出现在原始表中,那么你仍然需要在引用表中有一个约束如果你只有一个FK到4列而没有id,那就没必要了。 (并且在大多数DBMS中,与FK不同,约束不太可能以声明方式强制执行。)

PS 证明表格被规范化为某种正常形式需要证明它具有某些属性或遵循某些过程。仅仅显示特定列集是候选键(即唯一且没有更小的唯一子集)是不够的。

PPS

即使您的表位于6NF,您也应该强制执行由嵌入式连接依赖性引起的约束。

战斗中通常有一个以上的战斗机。因此,当一排出现一个给定的圆形和一个战斗机时,必须有一排具有相同的战斗,判断和圆形但另一个战斗机。一场战斗的判断不止一个。如果有两个法官同一个战斗,战斗机和圆形,另一排与其中一个法官和同一个战斗,战斗机和另一轮,那么必须与另一个法官与该战斗,战斗机和圆形。因此,虽然您的四列确实构成了五列表的候选键,并且您的表位于6NF,但您的表格会受到#34;异常和#34;通过分解到投影的归一化不能解决这个问题。

考虑表格Particpated(fighterID,fightID),Judged(judgeID,fight_ID,judgendID)& Round_of(roundNum,fight_ID)。你的桌子在fightID,fighterID,judgeID& amp; roundNum始终参与JOIN Judged JOIN Round_of。不幸的是,大多数DBMS都不允许您以声明方式强制执行此约束。