我正在开发一个PHP应用程序,需要将各种设置存储在数据库中。客户端经常会询问是否可以添加或更改/删除某些内容,这会导致表格设计出现问题。基本上,我有很多布尔字段,只是表明是否为特定记录启用了各种设置。
为了避免乱用表,我正在考虑将数据存储为序列化数组。我已经读到这被认为是不好的做法,但我认为这是使用这种方法的合理案例。
有没有真正的理由避免这样做?
任何建议表示赞赏。
感谢。
答案 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而不是数据库中。