2012-09-21 64 views
1

我想創建一個基本的表單生成器。因此,用戶可以在某種CMS系統中單擊HTML表單。我仍然在爲此進行數據庫設計,當涉及到複選框時,我有一個問題。設計一個「表單引擎」的數據庫

我的數據庫設計是這樣的:

領域

pk_field_id | field_type | field_name | default_value 
1   | textfield | text1  | Some default value 
2   | textfield | text2  | NULL 
3   | radio  | radio1  | NULL 
4   | checkbox | check1  | NULL 

所以這基本上我如何保存所選字段。當我讀這張表時,我可以通過switch聲明並讀取field_type的值,所以我知道要渲染哪種字段。

但這並非全部。我還有一個表格,其中包含像「單選按鈕」這樣的元素的「值」。

fieldvalues:

fk_field_id | label | value 
3   | Radio 1 | radio1 
3   | Radio 2 | radio2 
4   | Check 1 | check1 
4   | Check 2 | check2 

所以,現在當我讀表fields我可以JOINfieldvalues和方法,我知道哪些選項屬於radio什麼給checkbox。這一切似乎工作正常。

現在棘手的部分。當表單生成時,我還需要一個地方來保存輸入的值。 所以我的Form Engine自動創建一個額外的表。它爲fields表中的每個field_name創建一個列。因此,在這種情況下,動態創建的表看起來像這樣:

myForm的

pk_form_id | text1 | text2 | radio1 | check1 | language_id 

現在,當用戶輸入數據時生成的HTML表單,我可以很容易地保存所有輸入的數據。因爲文本字段只需要一列。分組單選按鈕最終只提交一個值。但是一組複選框當然可以在檢查兩個或多個複選框時提交多個值。

現在我的問題是,我該如何保存到數據庫?我認爲將多個值存儲在一列中並不是一個好主意,並由一個特定字符分隔。因爲這也使得難以執行搜索。

我最初認爲這是一個好方法,因爲我可以用簡單的SELECT ... WHERE查詢輕鬆地從myform表中拉出一行。

因此,無論如何,我不知道這是否是一個好的設置...以及如何處理複選框可以提交的多個值?

對此有何想法?

+0

http://stackoverflow.com/a/5858666/1114171 –

+0

哇,它就像你正在創建一個數據庫,在數據庫中! –

回答

0

我認爲你的問題是你沒有想到檢查控件是正確的。您需要將每個單選按鈕或複選框視爲自己的控件。

單選按鈕組合在一起的事實是影響其行爲的單選按鈕方面。每個單選按鈕實際上都有一個值(checked = true,false)。您的控制值表應該包含每個單選按鈕(和複選框)的條目,就像它爲每個文本框所做的一樣。

而不是保留選項按鈕及其值的子表,這些信息應該在您的主控制表中,應該擴展它以提供一些機制來對這些控件進行分組。您可以使用control_group表,其中包含fields的可選外鍵,或者您可能只是反規範化並在fields表上有一個可選的group-name列。

1

將值存儲爲XML/JSON將是一種可行的方式。根據您的RDBMS,數據庫可以本地處理XML和/或您可以使用XPath查詢文檔。 Drupal大量使用這種類型的存儲,並且對他們來說工作正常。