2012-05-07 25 views
1

我將在當前正在製作的網站上創建比賽。每個競賽都不會相同,並且可能有不同數量的輸入字段,用戶必須輸入以成爲競爭的一部分,例如。比賽:存儲任意數量的字段

比賽1可能只是需要一個姓

比賽2可能需要一個名字,姓氏和電子郵件地址。

我也將構建一個工具來觀察這些條目,以便我可以查看每個單獨的條目。

我的問題是什麼是最好的方式來存儲任意數量的字段?我想到了兩個選擇,一個是將每個條目寫入包含競爭對手所有條目的CSV文件,另一個是在數據庫中有一個帶有varchar字段的數據庫表,只將整個條目存儲爲文本。這兩種方法看起來都很混亂,這種任務有沒有普遍的做法?

我理論上可以爲每個可能的字段創建一個帶有列的數據庫表,但當競爭對象具有特定要求時不起作用,例如「用100個單詞告訴我們爲什麼...」或「輸入5最喜歡的事情。」

回答說:

我已經決定使用下面那裏有可以利用的每競爭多個不同用途的通用列中描述的方法。

最初我打算使用EAV,我仍然認爲它可能稍微適合這種特定場景。但是由於擴展性差和查詢複雜,通常不推薦使用它,而且我也不想養成使用它的習慣。這兩個答案在我的測試中工作得很好。

+0

如果你正在尋找內存實體來存儲任意數量的字段,我認爲'List'應該是最好的。 –

+2

謝謝,但不是尋找在內存中存儲。我正在尋找在哪裏存儲一份可能會在那裏呆一個月的固體副本。 –

回答

2

我認爲你對EAV持謹慎態度是對的,因爲它會使你的代碼變得更加複雜一些,並且對錶進行臨時查詢會更困難。

我見過很多企業的應用程序簡單地採用類似下面的模式 -

t_Comp_Data 
-----------  
CompId 
Name 
Surname 
Email 
Field1 
Field2 
Field3 
... 
Fieldn 

在這種情況下,一般的字段(字段1等),意味着不同的比賽不同的事情。爲了便於查詢,您可以爲每個競賽創建一個不同的視圖,並輸入正確的字段名稱。

+0

這是一個有趣的想法,但它沒有考慮到任意長度,而不是我期待的比賽有200個不同的領域。但在這種情況下,單個字段意味着我將不得不改變數據庫設計。決定,決定... –

+0

通常,我已經看到人們只是選擇一個好大小的數字 - 也許50個領域。您只爲每個特定的比賽使用必填字段。因此,如果comp只需要2個通用字段,則只能填寫Field1和Field2。 是的,它有點笨重,有點浪費,但我懷疑你會發現EAV比它的價值更麻煩。 –

+0

我也贊成能夠從數據庫中提取一段數據的目的,因此不需要額外查找Field4是否處於特定競爭狀態。也許像SQLite這樣不那麼嚴格的數據庫值得關注。我相信它不會在行上強制實施表模式。 – TheEvilPenguin

1

我通常不願意使用它,但是如果您使用數據庫,這看起來像Entity-attribute-value模型的一個很好的情況。基本上,你有一個帶有組成每個條目(Competition_id,可能是日期等)的標準字段的CompetitionEntry(實體)表,然後是帶有CompetitionEntry_id,Attribute和Value的CompetitionEntryAttribute表。你可能還需要另一個表每個競賽的模板屬性用於創建新條目。

不幸的是,你將只能存儲一個數據類型,它可能必須是一個大的nvarchar。 另一個缺點是難以針對EAV數據庫進行查詢。

另一種選擇是每個比賽創建一張桌子(可能在代碼中作爲比賽創作的一部分),但根據比賽的數量,這可能是不切實際的。

+1

在EAV上閱讀時,它似乎有點反對,這似乎主要是由於查詢困難和速度獲得有用的報告。在我看來,這似乎是一個相當不錯的選擇,儘管考慮對數據查詢的數量是相當小的。在CompetitionEntryAttribute表中有一個名爲「csharp_type」的可選字段,或者其他什麼東西,這樣做是不好的,所以如果需要的話,我可以配置某些字段進行計算?再次,這聽起來對我來說很亂... –

+0

我其實很喜歡在數據庫中存儲原始類型的想法,但我可能會將它存儲在屬性模板行旁邊,假設每個值行的外鍵返回模板行。 – TheEvilPenguin

+1

啊模板表,這將是一個更好的地方。我想我會選擇這個EAV佈局,因爲縮放問題不太可能會影響到我,如果是這樣,我可能會遇到很多其他瓶頸!謝謝。 –