2016-11-07 62 views
1

我必須創建一個數據庫結構。我有一個關於foreing鍵和良好做法的問題:SQL良好做法和外鍵

我有必須有一個字段,可以是兩個不同的字符串值,無論是「A」或「B」的表格。 它不能是其他任何東西(因此,我不能使用字符串類型字段)。

什麼是設計這個表格的最佳方式:

1)創建一個int領域這是一個外鍵到另一個表只有兩個記錄,一個字符串「A」和一個字符串「 B」

2)創建一個int字段然後,在我的應用,創建一個枚舉如本

public enum StringAllowedValues 
{ 
    A = 1, 
    B 
} 

3)???

提前,謝謝你的時間。

編輯:13分鐘後,我得到這一切真棒反饋。謝謝大家的想法和見解。

+1

是什麼樣的一個BOOL?你只需要isA = true或不是? – duDE

+1

只是一個建議,如果它是A或B,爲什麼不使用布爾值?或者一個整數爲0或1?如果我沒有弄錯,你可以在你的代碼中檢測到這個並相應地使用它。 – RandomStranger

+0

在MySQL中,解決這個問題的自然方法是使用'enum'。 –

回答

3

許多數據庫引擎的支持枚舉作爲數據類型。事實上,枚舉是正確的設計解決方案。

但是......

有可能決定一個外鍵一個單獨的表是更好的兩個要求。

第一個是:它可能有必要增加該列中有效的選項的數目。在大多數情況下,您希望在沒有軟件部署的情況下執行此操作;枚舉是「烘烤的」,所以在這種情況下,可以寫入新數據的表格效率更高。

第二個是:應用程序需要推理此列中的值,方式可能超出「A」或「B」。例如,「A」可能比「B」更大/更舊/更昂貴,或者您希望向最終用戶呈現A的某些其他屬性,或者A是某物的簡稱。

在這種情況下,將其顯式建模爲表格中的列,而不是將此知識烘焙到查詢中會好得多。

在30多年的使用數據庫,我個人從來沒有發現其中一個枚舉的決定是正確的情況下....

+0

回想起來,我同意;感謝您花時間回覆這些精明的觀察。 – azazaz

0

與這些整數代碼的含義創建副表。沒有任何東西會迫使你進入JOIN,但如果你需要這些數據的話。在您的C#代碼中,您仍然可以使用enum來查找問題,但嘗試使其與數據庫中的內容保持同步,反之亦然。其中之一應該是權威性的。

在實際應用中,你經常會發現短串比剛性枚舉更易於使用。在20世紀90年代,當電腦速度很慢,磁盤空間不足時,你可以用來做這樣的事情,以獲得合理的性能。現在,即使在擁有數億行的表格上,它也不是一個問題。