2013-05-26 56 views
2

我有一個有20列的MySQL INNOB表,我想將一個外鍵約束添加到大約10列。如果需要多個約束,對每列需要單獨的外鍵表?

我知道我可以用外鍵數據創建10個單獨的表,然後將這些作爲約束添加到初始表中 - 這是可能的,我之前完成了此操作。

問題 - 這將導致10個額外的表。是否有可能將這10個表(與外鍵數據)合併到一個表中,然後引用表/列作爲約束條件?

我問,因爲我可以看到我的數據庫結束了很多外鍵表。

回答

2

理論上你可以使用一個表,但這是一個非常糟糕的設計,因爲它不會爲每個唯一的數據類型提供一個簡單的枚舉「域」,並且它會爲每個唯一的數據類型乘以每個值表中的所有其他列,或換句話說,大約爲每列元素平均數的10次冪。

把這個具體的條款,如果你只有5個唯一值每列和10列,這將導致與9,765,625記錄表!我相信你會發現這將會非常低效!

這種數據乘法對於防止無關的NULL或列中的空字符串值是必要的,這會破壞您的外鍵關係。

爲每個唯一的數據集創建一個不同的「域表」是很常見的,如果你的數據庫中只有10個是「輕量級」的。

如果您不想爲每個約束使用域表,則始終可以使用ENUM('value1', 'value2', ...)作爲列數據類型而不是外鍵(這不需要您創建任何其他表)。

+0

歡呼聲 - 感謝您的評論,我會爲每個約束列表單獨列表。 – user1105192