有沒有自動 ENUM 之類的東西?
我管理的一些表包含一個字元串值(例如,一個 4 字的“類型”欄位)。
- 但是只有幾根
DISTINCT
弦- 應用程序可能會插入以前從未見過的新字元串,但是
- 在應用程序的生命週期中,字元串永遠不會超過 200 個,這意味著系統可以將這個欄位儲存在一個字節中。
磁碟空間不是問題,但字節越少,查找越快。
我有這個想法,我懷疑任何數據庫引擎都支持,但我想諮詢專家。
這些字元串可以映射到單獨表中的 ID,這樣您就不需要在主表的每一行上重複這些字元串。理想情況下,數據庫會在內部為您管理。對於低於 255 個不同可能性的所有字元串欄位,唯一字元串將在內部不可見地儲存為表定義的一部分,並且系統執行良好,無需修改應用程序。
在任何數據庫引擎上都有這樣的東西嗎?我主要使用 MySQL,但我很好奇這是否曾經實現過,沒有修改應用程序呼叫自定義包裝函式。(與 INET_ATON 類似,只是它會透明
INSERT
地對AUTO_INCREMENT
ing 表執行第一次獲取 ID 的操作)
也許我遺漏了一些東西,但你為什麼不直接使用具有外鍵關係的查找表來處理這類事情,可能有一些視圖來提供抽象層?這是一種非常常見的方法,所有數據庫都支持它,它很容易實現,並且它解決了其他問題,例如數據一致性(即,如果您想更新現有字元串而不更新表中具有該字元串的每一行,會發生什麼情況)。如果您知道查找表中的最大條目數,則可以選擇使主鍵數據量最小的數據類型。將來當有人決定不同值的數量需要超過您最初指定的任何限制時,這也更容易處理——您只需要增加兩個表中列的大小。
磁碟空間不是問題,
好的。
在應用程序的生命週期中,永遠不會有超過 200 個字元串,
著名遺言。我總是很樂意對這種要求下注,因為我知道我贏的次數比我輸的次數要多得多。
處理此問題的行業標準方法是使用單獨的表(通常稱為查找表)和對其的外鍵引用。一些數據庫平台支持 emun 數據類型,但在維護方面它們似乎不如查找表。更改列舉需要更改表的結構;更改查找表中的數據只是更改一行。
需要將字元串呈現給使用者的應用程式碼在查找表中查詢字元串及其 id 編號或按排序順序的程式碼,然後將結果集載入到組合框、列錶框或其他任何內容中。添加到該表的任何字元串都將自動出現在後續查詢中,除非您使用的記憶體不會自動更新。