代码之家  ›  专栏  ›  技术社区  ›  Oscar Foley

将一个表与同样是PK的FK建立1比1的关系是否正确?

  •  0
  • Oscar Foley  · 技术社区  · 12 年前

    我有一张桌子叫Player

    • 玩家ID(PK)
    • 更多列

    我想创建另一个具有 1到1 与名为PlayerExtraInfo的播放器的关系,以包含一些列。所以我有几个选择:

    1. 将PlayerExtraInfo列添加到Player表中,而不是创建新表

    2. 创建PlayerExtraInfo表并在Player表中创建FK。

      游戏者 桌子

      • 玩家ID(PK)
      • 更多列
      • 播放器附加信息ID(FK)

      播放器附加信息 桌子

      • 玩家附加信息(PK)
      • 更多列
    3. 相反:PlayerExtraInfo包含一个FK到Player表。为了确保关系保持为1比1,我添加了一个唯一的约束。

      游戏者 桌子

      • 玩家ID(PK)
      • 更多列

      播放器附加信息 桌子

      • 玩家附加信息(PK)
      • 更多列
      • 播放器ID(FK,唯一)
    4. 类似于选项3,但将PK和FK混合在一起。在这种情况下,我的外键也成为主键:

      游戏者 桌子

      • 玩家ID(PK)
      • 更多列

      播放器附加信息 桌子

      • 玩家ID(PK、FK)
      • 更多列

    我知道选项1、2是正确的,但由于性能问题,我选择了选项3或4。想到这3个和4个选项,一些对选项4的怀疑袭击了我: 所以我的问题是:

    • 选项3和4是否正确?
    • 选项4是否破坏了任何正常形式?
    • 还有其他我没有想过的选择吗?
    2 回复  |  直到 12 年前
        1
  •  4
  •   Dennis Traub    12 年前

    当用另一个表扩展一个表时,使用主键作为外键是完全可以的(也是推荐的)。

        2
  •  1
  •   Dumitrescu Bogdan    12 年前

    虽然选项2、3、4是正确的,但我认为选项1将提供最佳性能。即使使用聚集索引,额外的联接也是额外的联接。此外,外键会降低目标表的性能(我承认大量外键会降低性能,而不是一个外键)。

    除了扩展表只有主表记录的一小部分的情况,或者您希望两个表位于不同分区的情况外,我想不出有什么理由将该表拆分为和平表。