0

我有一个表叫球员是否正确与FK有1到1的关系,这也是PK?

  • PlayerID(PK)
  • 多个列

我希望创建一个具有名为PlayerExtraInfo包含一个1至1关系到球员的另一个表一些专栏。所以,我有几种选择:

  1. 而不是创建新表,加PlayerExtraInfo列于表球员

  2. 创建PlayerExtraInfo表,并有一个FK的球员表。

    球员

    • PlayerID(PK)
    • 多个列
    • PlayerExtraInfoID(FK)

    PlayerExtraInfo

    • PlayerExtraInfo(PK)
    • 更多列
  3. 相反:PlayerExtraInfo含有FK到播放表中。为了确保这种关系保持1比1,我添加了一个独特的约束。

    球员

    • PlayerID(PK)
    • 多个列

    PlayerExtraInfo

    • PlayerExtraInfo(PK)
    • 更多列
    • PlayerID(FK,唯一)
  4. 类似于选项3,但混合PK和FK于一体。在这种情况下,我的外键也变成了主键:

    球员

    • PlayerID(PK)
    • 多个列

    PlayerExtraInfo

    • 玩家ID(PK,FK)
    • 多个列

我知道选项1,2是正确的,但由于性能问题,我选项选项3或4,思考这些3 4个选项中选择约4攻击我有些疑惑: 所以我的问题是:

  • 是选项3,4正确吗?
  • 选项4是否打破任何标准格式?
  • 有没有其他的选择我没有想过?

回答

4

当使用另一个表扩展一个表时,绝对可以使用主键作为外键(并推荐)。

1

虽然选项2,3,4是正确的,但我认为选项1会提供最佳性能。即使在使用聚簇索引时,额外的连接也是额外的连接。另外一个外键会降低目标表的性能(我承认大量的外键会降级它,而不是单一的)。

除了扩展表只有主表记录的一小部分,或者您希望在不同分区上使用2表的情况之外,我想不出将该表拆分为两部分的原因。

+0

虽然这是事实,但它往往是不成熟的优化。另一方面,如果表2中的数据并不总是需要,选项4可以是更快的解决方案。 – 2012-08-17 12:34:54

+0

不是一个优化,是我扩展表格时的一个起点。此外,唯一的时候,选项4可以更快,然后1将插入/更新行(条件工作只完成表1)。选择时,我看不出4的速度快于1的原因。即使你选择的数据通常是1(除非你像从表中选择*一样) – 2012-08-17 12:52:19

+0

如果你的表中有BLOB,查询即使BLOB本身不是查询列的一部分,也会变慢。另一个原因可以是类继承的映射。看到我对迭戈的帖子的评论。 – 2012-08-17 15:20:09