0

我有一张名为 Player 的桌子

  • 玩家ID (PK)
  • 更多专栏

我想创建另一个与名为 PlayerExtraInfo 的 Player具有1 对 1关系的表以包含一些列。所以我有几个选择:

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

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

    玩家

    • 玩家ID (PK)
    • 更多专栏
    • PlayerExtraInfoID (FK)

    PlayerExtraInfo

    • PlayerExtraInfo (PK)
    • 更多专栏
  3. 相反:PlayerExtraInfo 包含一个 FK 到 Player 表。为了确保关系保持 1 对 1,我添加了一个独特的约束。

    玩家

    • 玩家ID (PK)
    • 更多专栏

    PlayerExtraInfo

    • PlayerExtraInfo (PK)
    • 更多专栏
    • PlayerID(FK,唯一)
  4. 类似于选项 3,但将 PK 和 FK 合二为一。在这种情况下,我的外键也成为主键:

    玩家

    • 玩家ID (PK)
    • 更多专栏

    PlayerExtraInfo

    • 玩家ID(PK,FK)
    • 更多专栏

我知道选项 1、2 是正确的,但由于性能问题,我是选项 3 或 4 的选项。考虑到这 3 和 4 选项,我对选项 4 产生了一些疑问:所以我的问题是:

  • 选项 3 和 4 是否正确?
  • 选项 4 是否破坏任何正常形式?
  • 还有其他我没有想到的选择吗?
4

2 回答 2

4

当用另一个表扩展一个表时,使用主键作为外键绝对没问题(并且也推荐)。

于 2012-08-17T12:06:01.050 回答
1

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

Except the case where the extended table will have but a fraction of the main table's records, or the case where you would like the 2 tables on different partitions, I cannot think of a reason to have that table split into peaces.

于 2012-08-17T12:27:38.587 回答