2010-11-18 54 views
0

我有一個包含大約500多個字段的表單(它是一個10頁的表單,不同的數據類型)。你們可以請我提供存儲表單數據的最佳方式嗎?我可以在多個邏輯上劃分的表格中創建500個字段,但似乎很多(或者這可能是最好的方法?!),因爲我有一些這樣的表單。我正在考慮序列化數據並存儲在longtext mysql字段中。這將有其缺點(我想的是如果客戶希望在未來搜索個別領域),但它看起來像一個非常快的解決方案。如果您能分享您遇到類似情況的經歷,我將不勝感激。存儲數百個字段的數據的最佳做法

回答

3

通常你不希望用戶在一次就座中填寫表格!因此,您需要某種工作流程來存儲草稿並修改以前的副本等。

另外假設表格的某些部分是可選的。

您可以使用主表定義一組數據庫表以跟蹤狀態,用戶名等,以及表單的每個可選部分的子表。

或者您可以定義一個XML模式,其中包含表單等所有可能的字段以及一些狀態信息。

如果你總是處理整個表單而不想搜索你的表單集合,那麼XML解析稍微好一些,因爲有一些漂亮的技巧用於將數據從XML移動到HTML表單並返回。如果您需要根據表單中的值進行搜索,那麼基於SQL的解決方案更可取。

+0

謝謝James,我實際上會有一個表單域模式,能夠(具有一大堆字段屬性)而不是xml。這部分工作非常好。此外,序列化的數據來回運行非常好。我想最好是詢問客戶他們是否需要現場級別的搜索並離開他們的答案(是:爲每個字段設置一個列,否:序列化) – pistolshrimp 2010-11-18 04:46:15

2

您可能需要500列 - 除非它們可以放在其他表格中。沒有看到你的要求可能很難說。

對它進行序列化會使數據庫無法使用的優點之一 - 查詢某些列值。

0
create table profile_details (
    user_id number, 
    field_name varchar, 
    field_value varchar 
); 

現在,你不僅沒有領域的數量有限,也很自由添加和你繼續發展和保持你的應用程序中刪除。

select firstname, lastname, zipcode 
from profiles p 
join profile_details d1 on (p.user_id=d1.user_id) 
join profile_details d2 on (p.user_id=d2.user_id) 
where d1.field_name='hobby' and d1.field_value='fishing' 
and d2.field_name='income' and d2.field_value>cast(250000 as number); 
+0

只要表格中有重複部分,該解決方案就會崩潰。假設表單中有一個「業餘愛好」部分,則需要存儲「業餘愛好1」,「業餘愛好-2」等。同時搜索有意義的搜索結果也會變得非常混亂。你會怎麼做「select firstname,lastname,zipcode where hobby =」Stamp Collecting「and income> 250000. – 2010-11-18 01:32:50

+0

對於你的第一個問題,至少你可以把這個邏輯編碼到你的應用程序中,而用500字段的表,你可以第二部分,我將在一分鐘內更新我的答案 – cababunga 2010-11-18 01:57:16

+0

這種反模式必須有一個正式名稱 - 「靜態問題的動態解決方案」。無論你做什麼一個新的屬性將需要佈局,驗證和代碼更改另一個數據庫列是沒有太多額外的工作。另外,如果您使用的是rails/grails類型的框架,當您向模式添加列時,大部分代碼都是免費的 – 2010-11-18 08:33:28