2010-05-30 13 views
1

我知道這個論壇有關這個問題的幾個問題。但我不是在討論爲同一個實體分割表(例如用戶)單個大型v/s多個小型MySQL表格用於存儲選項

假設我有一個巨大的選項表,它存儲了性別,婚姻狀態以及更多具有相同結構的特定於域的組列表選項。我計劃在OPTIONS表中捕獲。 另一個簡單的選擇是將該字段設置爲ENUM,但也存在這些缺點。 http://www.brandonsavage.net/why-you-should-replace-enum-with-something-else/

OPTIONS表:

option_id <will be referred instead of the name> 
name 
value <more like a description, and not a name/value pair> 
group 

查詢:select .. from options where group = '15'

用法:性別& MARITAL_STATUS將在人的表;但是存儲的值將來自選項

eg. 
    Person 
    .. 
    id=34 name=Prasad gender=31 marital_status=41 
    .. 

    Options 
    .. 
    31 gender male male 
    32 gender female female 
    ... 
    41 marital_status single single 
    42 marital_status married married 
    .. 
  • 由於該表有望成爲多租戶,無行可能會大幅增長。
  • 我認爲拆分表而不是尋找組會更容易編寫&執行。
  • 或者可能由組或租戶劃分?

回答

1

這實質上是一個EAV model,其中有所有的優點和缺點。

EAV模型用於可用於描述事物(「實體」或「對象」)的屬性(屬性,參數)數量可能很大,但實際應用的數量到一個給定的實體是相對適中的。它也被稱爲「稀疏矩陣」。

適當使用EAV表的一個很好的例子是醫學數據庫中的症狀。雖然可能有數千種症狀,但去看醫生的普通人只會出現少得多的症狀。

Wikipedia article about EAV應該告訴你這種模式是否適合您的特定應用,並建議在這方面的一些最佳做法。

請注意,如果您的例子列性別和婚姻狀況,和你有一個個人表,這些列更適當地屬於在個人表,而不是一個EAV表。

+0

非常感謝羅伯特。 你稍有誤解:Gender&Marital_Status將在Persons表中;但是,存儲的值將來自選項 例如。 人 .. ID = 34名=普拉薩德性別= 31個MARITAL_STATUS = 42 .. 選項 ... 31性別男男 32性別女女 ... 41個MARITAL_STATUS單個單 42 MARITAL_STATUS已婚已婚 ... – Prasad 2010-05-30 06:00:03

1

我工作的系統有這個確切的問題。它在醫療保健領域。

我們有一些標準化代碼表,如性別(明顯)和患者狀態(住院,門診,急診,觀察,術前)。我們把它們當作一個單獨的小桌子來處理。這些表格內容微小且相當靜態,不需要太多維護。因此,在這些情況下,我們擁抱使桌子變得小巧的效率,並支付各種各樣的費用。

但是,我們也有一些表格,其值由我們的醫院客戶,這樣的事情宗教,被送到我們未來的親屬關係(女兒,爸爸,等等)。我們也在本表中處理診斷,因爲醫院對這些事情有不同的編碼方式,而且它們不斷擴大。*當我們爲我們的系統添加新的醫院客戶時,以及這些醫院遇到新問題時,這些表格通常會在其中獲得新的價值。

這些表格中的值和我們需要保留的表格類型都反映了人類生活的多樣性,以及我們的醫院客戶經常發現有關其患者的新事物的事實。在這種情況下,將所有這些代碼保存在一個參考表中是有意義的。每個條目都有一個ID。我們還分配客戶ID和代碼類型(例如宗教,診斷),代碼名稱(例如PROT,CATH,BUDD)和代碼值(例如新教徒,天主教徒,佛教徒)。最後,我們添加一個優先級,讓我們可以控制應用程序中選取列表的順序。

在這種情況下,單個大表的效率命中被一個事實抵消,即我們可以擁有一個代碼庫來維護這個表,併爲它提供統一的用戶界面。

不要在此代碼表中輸入人名或任何其他潛在的機密信息,除非您想在未來某個時候承受很大壓力時處理複雜的安全問題。

如果您正在從事醫療IT方面的工作,最好弄清楚您將如何處理ICD-9和ICD-10診斷代碼。切換即將到來,這並不容易。

祝你好運

+0

感謝一噸Ollie。不,我在一個非常簡單的領域工作。祝你遷移到新代碼:) – Prasad 2010-05-31 12:48:21