将id保存在另一个表中的字段或字段中的数组中

时间:2012-10-15 21:26:09

标签: php mysql serialization data-integrity

我正在做一些php / mysql工作,并开始怀疑什么会更有效,哪种方法会有更好的数据完整性。

我从未使用方法#2,但我已经看到它在CMS或电子商务等系统中使用过。我经常使用#1。

示例:在我的系统中创建“任务”时,我需要为其分配1个或多个用户。


方法#1 在这个方法中,我将有一个表,它将存储task_id和user_id。我会查询这个表来获得关系。


方法#2 在这个方法中,我会在任务表“users_assigned”中有一个列,这将存储一个序列化数组,我需要时将其反序列化。例如

$data = array('John', 'Jack', 'Jill');
// after serialization it would look like...
// a:3:{i:0;s:4:"John";i:1;s:4:"Jack";i:2;s:4:"Jill";}

哪种方法最适合在数据库中存储此类数据?

2 个答案:

答案 0 :(得分:1)

如果你没有强烈反对非规范化的理由(将数据存储在序列化数组中,破坏正常形式的规则),我会坚持使用单独的表。提取有点复杂,需要连接,但您可以更好地控制数据库中的关系完整性(外键),您的数据组织更好,定义更清晰。

请看一下这篇文章http://backchannel.org/blog/friendfeed-schemaless-mysql,了解非规范化的极端情况。但是,在他们的情况下,他们不会向行集提取任何其他链接数据(在您的情况下,您可能希望加入有关序列化数组中用户的更多信息)。

答案 1 :(得分:0)

方法2是一个坏主意。几乎可以阻止你加入表格(这可能仍然存在,但只能用你所做的代码来证明它可以完成而不是实际使用)。