【问题标题】:Creating SQL composite Key Logic创建 SQL 复合键逻辑
【发布时间】:2016-05-08 08:26:16
【问题描述】:

我正在布置一个数据库设计,并且有一个关于创建复合 ID 的问题。我坚持的数据库部分是一个“圆形”表。

数据库的目标是存储综合格斗比赛的结果,以便进行统计分析。

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

这是解决此问题的最佳方法吗?有什么我没有考虑的因素吗?

【问题讨论】:

  • 复合键意味着将 4 列连接为 1。复合键是跨多列的键。您应该添加一个包含所有 4 列的键约束。
  • 是的,我明白,我将上面的列连接起来只是为了展示我的想法。我想我的问题是 - 如果在 4 行之间添加一个键约束与仅使用一个自动增加的列来标识这些行中的每一行,是否存在固有缺陷或缺点?

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


【解决方案1】:

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

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

PPS

即使您的表在 6NF 中,您也应该强制执行一个由于嵌入式连接依赖关系而产生的约束。

一场战斗中通常有不止一名战士。因此,当一个给定的回合和一个战斗机出现一排时,必须有一个具有相同战斗、判断和回合但另一名战斗机的排。一场战斗可以有多个法官。如果有两个裁判在同一排,拳击手和一轮,另一排是其中一个裁判,同一场比赛,拳击手和另一轮,那么必须有另一排与另一位裁判进行那场比赛,拳击手和圆形。因此,尽管您的四列确实构成了您的五列表的候选键并且您的表处于 6NF 中,但您的表仍会受到“异常”的影响,这些“异常”无法通过分解为投影的标准化来解决。

考虑表 Particpated(fighterID,fightID), Judged(judgeID,fight_ID,judgeID) 和 Round_of(roundNum,fight_ID)。您的表在fightID、fighterID、judgeID 和roundNum 上的投影始终是Participated JOIN Judged JOIN Round_of。不幸的是,大多数 DBMS 不允许您以声明方式强制执行此约束。

【讨论】:

  • 我想我能听懂你说的,但不太同意。是的,任何一场比赛都有多名战士和法官。然而,战斗/战士/法官/回合的组合是独一无二的。并且裁判给那位选手的分数,在那轮比赛中,在那场比赛中也是独一无二的。您是说因为我将输入该数据组合,每轮两次,它不遵循规范化规则?
  • 您说得对,尽管此表受制于 embedded 依赖关系以及相关的更新异常,但它们并不是规范化将删除的那些。请查看我编辑的消息。
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 2017-01-15
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 2017-04-07
  • 2021-02-05
  • 1970-01-01
相关资源
最近更新 更多