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