2008-12-03 63 views
22

例如,我有一個「用戶」表,其中有一個枚舉列「type」,其中有兩個可能的值:「individual」和「organization」。它們是相互排斥的並且是強制性的(每一行必須只有一個值可能是兩個值,這是否是一個使用枚舉的好例子?爲什麼這麼做/不是?數據庫枚舉 - 優缺點

使用ENUM(set)有什麼優點和缺點? ?類型數據庫字段

+1

MySQL以外的其他RDBMS支持ENUM數據類型嗎? (這不是一個修辭問題。) – Tomalak 2008-12-03 11:26:46

+0

@Tomalak:我知道postgresql的確如此。 – 2008-12-03 11:29:43

回答

17

是的,這似乎是一個很好的候選人枚舉

優點:

  • 小(磁盤空間)
  • 快速(整數比較)
  • 易於理解的(主要)

缺點:

  • 不能在不改變表結構
  • 必須小心的地方大小寫增加值
  • 可以是非常混亂,如果使用不好......不要使用active = enum('1','0'),因爲我必須忍受!
  • 所有數據庫
9

我個人一直喜歡有這個標準INT列不支持,有一個外鍵鏈接到一個描述表。這使您可以限制類型標識列的值。

當然,這可能會導致表膨脹,但它確實允許您在描述表中使用「本地化」表,以便您的應用程序可以在需要時在下拉菜單/報告等中顯示本地化內容。

User.UserTypeID -> UserType.UserTypeID -> UserTypeLocalised.UserTypeID where locality = ?? 

這也是更多的數據庫不可知的因此更容易移植到不同的平臺。

此外,用戶無論是個人還是組織都不太合適。我希望用戶成爲組織的一部分,這需要一個組織表,並且用戶需要有一個OrganisationID列。用戶類型通常更可能是「人員/系統」區別(假設您的系統使用環境登錄來執行操作並且您想要進行審計)。

6

將引用數據放入帶有外鍵的表中意味着數據庫可以強制執行數據完整性規則。您還可以添加其他類型(例如「內部」或「非盈利」),而無需擴展數據庫模式。最後,您可以使用標誌或其他編碼註釋參考表,以便在需要時實施數據驅動的業務邏輯。