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数组是我的示例上面给出)。

4

5 回答 5

3

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

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

SELECT text, COUNT(*) AS count
FROM answers
WHERE question_id = 1
GROUP BY text
于 2012-04-22T11:23:38.077 回答
1

我会问自己的问题是:

除了我现在想到的数据,我还会有其他用途吗?正如已经指出的那样,您可以将数据用于统计目的。

或者:还有其他人吗?!

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

或者,如果我知道将始终作为一个整体访问数据并且访问条目的某些部分几乎没有用处,我会进行序列化存储。

我的 2 美分。

于 2012-04-22T11:40:03.463 回答
0

我会说方案一的适应性更强,方案二的效率更高,所以选择是在效率和适应性之间。效率是通过数据库传递变量来实现的,而不是解析序列化字符串的额外步骤。适应性,因为不同调查的数据结构可能不同,例如,无需实际修改数据库。此外,不需要定义数据类型。

于 2012-04-22T11:25:31.380 回答
0

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

于 2012-04-22T11:29:23.457 回答
-1

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

  1. 跨平台格式;
  2. SQL 是众所周知的标准;
  3. PHP + SQL 是一个非常好的组合;
  4. SQL数据库有统计;
  5. 文学等形式的良好支持......
于 2012-04-22T11:51:06.437 回答