2012-04-22 58 views
1

我正在構建調查構建系統,並且不確定如何最好地存儲數據。這兩個選擇我可以看到我有有:要序列化數組或不序列化數組:如何存儲調查

  1. 要使用串行化陣列,或
  2. 向每個元件,存儲作爲一個單獨的行中的相關表

例如通過使用首先,我將存儲像下面的序列化數組:

Array 
(
    [name] => Survey 
    [sections] => Array 
     (
      [0] => Array 
       (
        [name] => Introduction 
        [pages] => Array 
         (
          [0] => Array 
           (
            [text] => Please answer the following questions. 
            [questions] => Array 
             (
              [0] => Array 
               (
                [text] => Are you male or female? 
                [answers] => Array 
                 (
                  [0] => Male 
                  [1] => Female 
                 ) 

               ) 

             ) 

           ) 

         ) 

       ) 

     ) 

) 

的好處我認爲這是:

  1. 它是集中的,並且
  2. 這是很容易使用簡單的查詢類的腳本中編輯:

    UPDATE surveys SET data = '$serialized_array' 
    

主要缺點我看到的情況是:

  1. 腳本以外的編輯很困難(例如使用Navicat時)

我也聽說將數據存儲爲序列化數組是不好的做法。雖然我認爲這完全取決於上下文(或者我聽到這個錯誤的人)。

通過使用第二(存儲每個元素作爲在相關表中的單獨的行),我想有一個數據庫結構是這樣的:

調查

id name 

1 Survey 

部分

id name   survey_id index 

1 Introduction 1   0 

頁面

id text       section_id index 

1 Please answer these questions. 1   0 

問題

id text     page_id index 

1 Are you male or female? 1  0 

回答

id text question_id index 

1 Male 1   0 
2 Female 1   1 

我看到這樣做的好處是:

  1. 有內容的更好的分離,
  2. 它更容易之外編輯腳本(使用Navicat的時候一樣,例如)

主要缺點我看到的情況是:

  1. 這是比較難的腳本中編輯(許多查詢複雜的邏輯來處理重新排序的元素或重新結構化的答案)

我給你的問題是:這兩種方法中的哪一種(如果確實是這兩種方法)更適合手頭的任務?我很想將數據作爲序列化數組存儲,因爲構建起來更容易,而且更容易控制。雖然我可以看到... 優雅 ...將數據存儲爲相關表中的單獨行。

如果它有任何相關性,那麼現在使用JavaScript構建調查問卷:使用(特別是)jQuery添加,刪除和重新排序HTML元素,然後以表單形式提交完成的產品(使用$_POST數組就是我上面給出的例子)。

+0

如果你願意考慮不同的數據庫,如文檔存儲如MongoDB的問題可能會變得毫無意義。 – cmbuckley 2012-04-22 11:31:51

+0

看起來很有趣。儘管我並不是僅僅爲我自己的用途建立這個調查系統,而是爲了任何人和每個人下載和實施自己,所以最好不要依賴不太常用的第三方軟件 – MichaelRushton 2012-04-22 11:36:50

回答

3

以標準化格式存儲數據可能是這裏的方法。當您收集用戶的答案時,通常是因爲您想對結果執行一些分析。

通過以規範化的形式進行存儲,很容易看到男性/女性的反應者比例。

SELECT text, COUNT(*) AS count 
FROM answers 
WHERE question_id = 1 
GROUP BY text 
+0

我認爲存儲規範化形式的數據在長期內具有其他優點。您可以輕鬆添加新類型的問題和答案(例如多選或填寫值)。此外,有些問題可能會被歸檔或標記爲已關閉等。將它們存儲在數據庫中允許您輕鬆添加新屬性並提供更大的靈活性。 – 2012-04-22 11:36:09

+0

是的,我絕對可以在這裏看到好處。雖然這會使調查的構建變得更加困難,但它使報告變得更容易(如果只需要一個簡單的SQL查詢而不是複雜的PHP腳本來解析串行化數組,那麼一次性自定義樣式報告就會變得微不足道)。 – MichaelRushton 2012-04-22 11:39:47

0

我會說選項1更具適應性,選項2更有效,所以選擇是在效率和適應性之間。效率是通過數據庫傳遞變量來實現的,而不是解析序列化字符串的額外步驟。適應性,因爲不同的調查數據結構可能會有所不同,例如,實際上並未修改數據庫。另外,數據類型不需要定義。

0

存儲在數據庫中比存儲在序列化的形式更好。另外,考慮將數據存儲在配置文件中,這些配置文件可以在腳本之外輕鬆讀取和編輯(json,yaml,ini格式)。在PHP中讀取和寫入這些格式有簡單的方法。

1

我都會問自己的問題是:

我會永遠有另一個使用該數據比我心目中的權利嗎?正如已經指出的那樣,您可以將數據用於統計目的。

或者:其他人嗎?!

如果我正在構建某種「數據死角」,即我知道數據將很少/再也不會被編輯,那麼我將只用於序列化存儲。

或者我會做序列化存儲,如果我知道數據將始終作爲一個整體進行訪問,並且在訪問條目的某些部分時很少用到。

我的2美分。

-1

在我看來,最舒適的方式來存儲數據在數據庫中,原因如下:

  1. 跨平臺的格式;
  2. SQL是衆所周知的標準;
  3. PHP + SQL是一個很好的組合;
  4. SQL數據庫有統計數據;
  5. 在文學形式等的良好支持...
+0

這不是@MichaelRushton所要求的。他問什麼是將數據存儲在數據庫中的更好方法。 – justinhartman 2014-07-14 20:31:56