2009-11-24 115 views
3

我正在研究一个PHP应用程序,它需要将各种设置存储在数据库中。客户经常询问是否可以添加或更改/删除某些东西,这已经引起了桌子设计的问题。基本上,我有很多布尔字段,它们只是表示是否为特定记录启用了各种设置。PHP/MySQL - 将数组存储在数据库中

为了避免与表格混淆,我正在考虑将数据存储为序列化数组。我已经读过,这被认为是不好的做法,但我认为这是使用这种方法的合理情况。

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

任何意见赞赏。

谢谢。

+0

这听起来像你的数据需要标准化一下。你可以张贴餐桌结构吗? – 2009-11-24 14:45:01

回答

10

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

但是,有很多情况下可以考虑违反正常形式。你打交道的领域有多少?他们都是布尔人吗?

存储序列化为你的数据库将具有以下缺点(等等)的字符串数组:

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

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

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

+0

伟大的回应。另外,如果你想'在数据库中存储数组',你可能想看看ORM,它可以使数据库访问以更加面向对象的方式运行。学说是PHP的一种这样的ORM。然而,学习教义并不是微不足道的。 – 2009-11-24 17:07:51

+0

问题是连接可能非常昂贵,并且对于Web应用程序来说似乎很常见,以避免多表连接。如果您要缓存对象并使用Solr等搜索引擎(消除搜索问题),则尤其如此。 – 2011-05-03 17:50:53

+0

@Adam根特:同意。没有通用的解决方案,但通常数据库应尽可能标准化。然而,正如你所提到的那样,当然有一种情况是可以将序列化的JSON化的数组放入数据库中。 – phidah 2011-05-04 19:19:31

0

有一点是可扩展性受限。数据库不应该与编程环境混在一起。还要更改数据库中的值和调试更容易。数据库和cgi可以互换到另一个数据库或像Perl一样的cgi。

0

使用关系数据库的原因之一是帮助维护数据完整性。如果你只是将一个序列化数组转储到一个表中,那么数据库就没有办法检查你在这个blob中拥有什么意义。

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; 

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

0

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