2016-11-11 105 views
1

比方說,我有兩張表,一張將帶有外鍵的汽車存儲到第二張存儲品牌的參考表中。什麼是更好的做法...創建枚舉並將汽車屬性設置爲枚舉類型,或者從表中加載品牌對象列表?我應該將參考表值作爲枚舉存儲嗎?

乍看之下,我認爲從表中加載品牌會更好,因爲如果添加了新品牌,它不需要更改代碼(對枚舉)。但從性能的角度來看,每次我需要找出所有可能的品牌(例如驗證)時,我都必須打電話給數據庫,這可能很昂貴。

最好的做法是什麼?

`Car { 
int SerialNumber; 
(int or enum?) BrandId; 
string Owner; 
DateTime Year; 
}` 

`(class or enum?) Brand { 
int Id; 
string Name; 
}` 
+0

你使用任何ORM,像EntityFramework? –

+0

計算「重新安裝」軟件的成本,當您需要添加新品牌與較少的sql服務器旅程時。 – Fabio

+0

您是否確實在執行數據庫查詢以驗證品牌時遇到性能問題?那麼,如果你想保持數據在你的源代碼中被硬編碼,那麼數據庫的目的是什麼?使用數據庫,只有當你有性能問題(我懷疑)你開始考慮另一種方法 – Fabio

回答

1

我會遠離MySQL的枚舉;向枚舉字段中添加一個新值需要一個ALTER TABLE,這需要對整個表進行有時是昂貴的重構。

此外,請考慮您是否確實希望品牌在代碼中成爲枚舉。每次有新品牌時,你是否真的想重新編譯和重新部署?

即使您決定爲您重新編譯和重新部署正確的答案,也沒有什麼能夠阻止您只是讓應用程序本身(或其安裝程序/設置)確保品牌查找表對應於枚舉在您的代碼中(只需確保明確指定枚舉值的值,並且不要將查找表的ID設爲自動,以防止不匹配)。

最後要考慮的是一個枚舉:如果您有多個不同的客戶端,您需要保持所有客戶端的代碼庫中的enum同步。

0

如果您的業務邏輯對於不同品牌有所不同,最好將它放在代碼中。確保所有數據庫中特定品牌的ID均相同。在這種情況下,檢查重構,如「用子類替換類型代碼」。如果您不使用代碼中的id來更改某些邏輯,則可以將品牌置於數據庫中。您可以緩存值以獲得更好的性能。我想品牌不會經常改變。

相關問題