【问题标题】:To serialize array or not to serialize array: how to store a survey序列化数组或不序列化数组:如何存储调查
【发布时间】:2012-04-22 11:19:09
【问题描述】:

我正在构建一个调查构建系统,但不确定如何最好地存储数据。我可以看到我有两个选择:

  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 元素,然后以表格形式提交最终产品(使用 @987654328 @array 就是我上面给出的例子)。

【问题讨论】:

  • 如果您愿意考虑使用不同的数据库,例如 MongoDB 等文档存储,这个问题可能没有实际意义。
  • 这看起来很有趣。虽然,我构建这个调查系统并不是为了我自己使用,而是让任何人和每个人自己下载和实施,所以最好不要依赖不太常用的第三方软件

标签: php mysql serialization


【解决方案1】:

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

通过以标准化形式存储,例如可以轻松查看响应者中男性/女性的百分比。

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

【讨论】:

  • 我认为以标准化形式存储数据从长远来看还有其他优势。您可以轻松添加新类型的问题和答案(例如多项选择或填写值)。此外,某些问题可能会被存档或标记为已关闭等。将它们存储在数据库中可以让您轻松添加新属性并提供更大的灵活性。
  • 是的,我绝对可以看到这里的好处。尽管这会使调查的构建变得更加困难,但它使报告变得更加容易(如果只需要一个简单的 SQL 查询而不是一个复杂的 PHP 脚本来解析序列化数组,那么一次性自定义样式的报告就很简单了)。
【解决方案2】:

我会问自己的问题是:

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

或者:还有其他人吗?!

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

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

我的 2 美分。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 这不是@MichaelRushton 所要求的。他问什么是在数据库中存储数据的更好方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-25
        • 2013-10-24
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        • 2016-09-17
        相关资源
        最近更新 更多