序列化数组或不序列化数组:如何存储调查

时间:2012-04-22 11:19:09

标签: php mysql serialization

我正在建立一个调查建设系统,我不确定如何最好地存储数据。我能看到的两个选择是:

  1. 使用序列化数组或
  2. 将每个元素存储为相关表格中的单独行
  3. 例如,通过使用第一个,我会将类似下面的内容存储为序列化数组:

    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'
      
    3. 我看到的主要缺点是:

      1. 很难在脚本外编辑(例如,当使用Navicat时)
      2. 我也听说将数据存储为序列化数组是不好的做法。虽然我猜这完全取决于上下文(或者我听到这个错误的人)。

        通过使用第二个(将每个元素作为相关表中的单独行存储),我将拥有这样的数据库结构:

        调查

        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时)
        3. 我看到的主要缺点是:

          1. 在脚本内部进行编辑比较困难(许多查询具有复杂的逻辑来处理重新排序的元素或重新构造的答案)
          2. 我的问题是:这两种方法中的哪一种(如果确实如此)更适合手头的任务?我很想将数据存储为序列化数组,因为它看起来更容易构建并且更容易控制。虽然我可以看到...... 优雅 ...将数据存储为相关表格中的单独行。

            如果它有任何相关性,目前调查是使用JavaScript构建的:使用(特定)jQuery添加,删除和重新排序HTML元素,然后以表格形式提交成品(使用{{ 1}}数组就是我上面给出的例子。

5 个答案:

答案 0 :(得分:3)

以规范化形式存储数据可能就是这里的方法。当您从用户那里收集答案时,通常是因为您想对结果进行一些分析。

通过以标准化形式存储,可以很容易地看到男性/女性的响应者百分比。

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

答案 1 :(得分:1)

我会问自己的问题是:

我现在能否再次使用这些数据而不是我现在想到的数据?正如已经指出的那样您可以将数据用于统计目的。

或者:还有其他人吗?!

我只会在我正在构建某种“数据死胡同”的情况下使用序列化存储,即我知道很少/永远不会再次编辑数据。

或者,如果我知道数据将始终作为一个整体访问,并且访问部分条目的用途很少,我会进行序列化存储。

我的2美分。

答案 2 :(得分:0)

我认为选项1更具适应性,选项2更有效,因此选择在效率和适应性之间。通过数据库传递变量来实现效率,而不是解析序列化字符串的额外步骤。适应性,因为不同的调查数据结构可能不同,例如,没有实际修改数据库。此外,不需要定义数据类型。

答案 3 :(得分:0)

在数据库中存储比以序列化形式存储更好。另外,考虑将数据存储在配置文件中,这些文件可以在脚本之外轻松读取和编辑(json,yaml,ini格式)。有一些简单的方法可以在PHP中读取和编写这些格式。

答案 4 :(得分:-1)

在我看来,最舒适的存储数据方式是在数据库中,原因如下:

  1. 跨平台格式;
  2. SQL是众所周知的标准;
  3. PHP + SQL是一个非常好的组合;
  4. SQL数据库有统计信息;
  5. 以文学等形式提供的良好支持......