PHP / MySQL - 在数据库中存储数组

时间:2009-11-24 14:39:23

标签: php sql arrays

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

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

有没有真正的理由避免这样做?

任何建议表示赞赏。

感谢。

5 个答案:

答案 0 :(得分:10)

真正的原因是规范化,你会通过这样做来打破first normalform

但是,在许多情况下可以考虑违反正常形式。你在处理多少个领域,他们都是布尔人?

在数据库中存储序列化为字符串的数组将具有以下缺点(其中包括):

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

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

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

答案 1 :(得分:1)

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

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;

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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