【问题标题】:PHP/MySQL - Storing array in databasePHP/MySQL - 在数据库中存储数组
【发布时间】:2010-12-19 21:57:41
【问题描述】:

我正在开发一个需要将各种设置存储在数据库中的 PHP 应用程序。客户经常询问是否可以添加或更改/删除某些东西,这一直导致表格设计出现问题。基本上,我有很多布尔字段,它们只是指示是否为特定记录启用了各种设置。

为了避免再弄乱表格,我正在考虑将数据存储为序列化数组。我读到这被认为是不好的做法,但我认为这是使用这种方法的合理案例。

有什么真正的理由可以避免这样做吗?

任何建议表示赞赏。

谢谢。

【问题讨论】:

  • 听起来你的数据需要标准化一点。你能发布表结构吗?

标签: php sql arrays


【解决方案1】:

您不能将设置存储在服务器上的配置文件中是什么原因?例如,我将网站或应用程序设置保存在 config.php 而不是数据库中。

【讨论】:

    【解决方案2】:

    正确的方式(并不总是最好的方式)

    CREATE TABLE mytable (
        myid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
        mytitle VARCHAR(100) NOT NULL
    );
    CREATE TABLE myarrayelements (
        myarrayid INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
        myid INT UNSIGNED NOT NULL,
        mykey VARCHAR(100) NOT NULL,
        myval VARCHAR(100) NOT NULL,
        INDEX(myid)
    );
    
    $myarray = array();
    $res = mysql_query("SELECT mykey, myval FROM myarrayelements WHERE myid='$myid'");
    while(list($k, $v) = mysql_fetch_array($res)) $myarray[$k] = $v;
    

    虽然有时存储逗号分隔列表更方便。

    【讨论】:

      【解决方案3】:

      真正的原因是规范化,这样做会破坏first normalform

      但是,在许多情况下可以考虑违反正常形式。您要处理多少个字段,它们都是布尔值吗?

      将序列化为字符串的数组存储在数据库中会有以下缺点(除其他外):

      • 当您需要更新设置时,您必须首先从数据库中提取当前设置,反序列化数组,更改数组,序列化数组并更新表中的数据。
      • 搜索时,您将无法只询问数据库给定用户(或一组用户)是否禁用或启用了给定设置,因此您将没有任何搜索机会。

      相反,您应该真正考虑创建另一个表的选项,该表将您需要的记录作为与另一个表的一对多关系。因此,您不会有 30 个空字段,而是可以为每个偏离默认值的选项设置一行(请注意,此选项也有一些缺点,例如,如果您更改默认值)。

      总而言之:我认为你应该避免序列化数组并将它们放入数据库中,至少如果你只关心上述缺点的话。

      【讨论】:

      • 反响很好。此外,如果您想在数据库中“存储数组”,您可能希望查看 ORM,它可以使数据库访问以更加面向对象的方式进行。 Doctrine 就是这样一种 PHP 的 ORM。然而,学习教义并非易事。
      • 问题是连接可能非常昂贵,并且对于 Web 应用程序来说避免多表连接似乎很常见。如果您要缓存对象或使用像 Solr 这样的搜索引擎(消除搜索问题),则尤其如此。
      • @Adam Gent:同意。没有通用的解决方案,但总的来说数据库应该尽可能规范化。但是,正如您所提到的,当然存在将序列化、JSON 化、...、数组放入数据库的场景。
      【解决方案4】:

      使用关系数据库的原因之一是有助于维护数据完整性。如果您只是将序列化数组转储到表中的 blob 中,则数据库无法检查您在该 blob 中的内容是否有意义。

      【讨论】:

        【解决方案5】:

        有一件事是可扩展性有限。数据库不应与编程环境混合。更改数据库中的值和调试也容易得多。数据库和 cgi 可以互换到另一个数据库或 cgi,如 perl。

        【讨论】:

          猜你喜欢
          • 2013-08-14
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 2014-06-01
          • 2020-06-07
          • 1970-01-01
          • 1970-01-01
          • 2022-06-15
          相关资源
          最近更新 更多