2011-07-18 77 views
5

有兩種方法可以在數據庫中存儲枚舉類型:作爲字符串或整數。是否將數據庫字符串枚舉轉換爲值得的整數?

將枚舉(sex = {male,female},account_type = {regular,pro,admin}等)保存爲字符串使事情更具可讀性,但需要比整數更多的空間。

另一方面,整數需要映射枚舉進出數據庫。作爲一個好處,區分大小寫在數據庫之外用整數處理。

假設兩者都被索引,是否做整數轉換一般值得呢?整數查找速度快多少?

也許一個具體的例子可以幫助可視化的東西。 讓我們把上面的account_type帶到100,000個用戶的數據庫。

字符串枚舉

假設8位固定長度CHAR型

7*100000*8/8 = 700000 bytes 

整數枚舉

假設8位整數TINYINT

100000*8/8 = 400000 bytes 

似乎大小几乎是整數枚舉的一半。還需要對索引進行合併。

回答

3

答案是,如你所料,它取決於。

數據庫越大越顯著節省空間 - 不僅在磁盤上,而且在網絡IO和計算。

就個人而言,我會存儲整數,而不是文本值,除非有直接枚舉DB supprt(如MySQL的那樣)。

1

如果數據庫的大小成爲問題,則整數將佔用較少的內存。

這取決於如果你是直接從數據庫沒有通過您的代碼層會返回值(例如某種形式的翻譯)。如果你是,那麼你就需要在數據庫中的字符串值(但你可以將它們存儲在一個相關的表查找)

0

始終存在是否DB將在由人來看待,而不是通過問題執行轉換的應用程序。如果一個人出於某種原因正在查看數據庫,那麼文本會更好 - 如果有DBA可能無法訪問代碼以查看枚舉轉換,那麼情況尤其如此。

如果存儲的數據的大小,更重要的,然後轉換爲整數是一個更好的主意。但是對於這個改進的空間,你會失去可讀性。這取決於什麼是最重要的因素。

當然,你可以包括存儲過程或意見或諸如此類來看看存儲整數數據,並將其轉換爲字符串值,如果你需要在兩者之間平衡這將是有意義的。

但正如Oded所說 - 沒有一個簡單的答案。每種情況都會有所不同。

0

實際上,無論如何,你可能想要做的是在數據庫中創建一個映射表。
這需要處理很多事情 -
1)像往常一樣分配Id列,然後將外鍵分配給相應的列。這可以防止插入無意義的值。這也涉及正常化問題。
2)通過映射表,您可以使用視圖來構建僅限數據庫的選擇,只需將所需文本字符串的id值換出即可。
3)通過映射表,處理國際化問題也變得更加容易(注意:這並不一定意味着更簡單,正好)。下面是我會成立了表這個:

Gender_Mapping 
Id | Enum_Mapped_Value | DBA_Readable_Description 

Gender_Description 
Id | Gender_Mapping_Id | Language_Id | Language_Specific_Description 

對於檢索問題,(Enum_Mapped_Value)(Gender_Mapping_Id, Language_Id)應該是唯一的(或返回唯一從視圖中,至少)。
Enum_Mapped_Value應該是用於將枚舉映射到數據庫的某些字符代碼(可能是5個字符?)。是否不是使用序號值或枚舉本身的名稱 - 使用構造函數分配的內部值;否則,未來的開發人員可能會對枚舉進行重新排序,或者重新命名它們 - 但是內聯值更有可能被孤立。
Language_Id應該將某個外鍵映射到Language_Mapping某種表,如果你有計劃處理多種語言。

相關問題