Serialize vs Implode

时间:2012-11-02 14:30:09

标签: php mysql arrays serialization implode

您认为在MySQL数据库中的记录中存储一些图像ID的更好方法是什么?它只是图像ID,用于从不同的库中获取图像。

我是否会像1#4#7#9#10#12那样在记录中内爆id或者我只是序列化数组并存储它?使用一个而不是另一个是否有任何性能优势?稳定性偏好?

我一直使用内爆和爆炸,从来没有真正考虑过。 感谢。

5 个答案:

答案 0 :(得分:7)

如果你不想(超过?)规范化你的表,而你真的只想存储一个id列表,那么我建议使用一个简单的逗号分隔列表,因为MySQL已经有一些函数可以直接处理使用逗号分隔的字符串值:

FIND_IN_SEThttp://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

SELECT FIND_IN_SET('b','a,b,c,d'); --> 2

CONCAT_WShttp://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

SELECT CONCAT_WS(',','First name',NULL,'Last Name'); --> 'First name,Last Name'

当然,您将无法执行SQL JOIN,但它仍然可以提供帮助。

答案 1 :(得分:2)

我更喜欢序列化或JSON_encode 更灵活,例如,您可以在此处添加图片标题和其他详细信息......

答案 2 :(得分:2)

据我所知,在这种情况下没有显着差异,但implode()有点快,因为它假设一个数组而serialize()不知道你传递给它的是什么。

编辑基于OP的评论:

  

所有图像都存储在一个单独的库表中,其中包含标题和描述以及类似的内容。但是,我明白你的观点。

在这种情况下不是一个好主意,所以将几个ID序列化到一个字段中。您需要的是两个表之间的* -to-Many关系。这是表示多值字段的正确方法:

+----------------------+
|  USER                |
+---------+------+-----+
| user_id | name | ... |
+---------+------+-----+

+----------------------+
|  USER_PICTURE        |
+---------+------------+
| user_id | picture_id |
+---------+------------+

+--------------------------+
|  PICTURE                 |
+------------+-------+-----+
| picture_id | title | ... |
+------------+-------+-----+

答案 3 :(得分:0)

我的朋友,序列化是获取对象状态的字符串表示。即使它有效,我也不认为这是做你想做的最好的方法。我更喜欢用id存储一个json对象。因为json对象是多平台的,所以是一个字符串并且很容易被人类读取,我认为这是一种很好的方法。

答案 4 :(得分:0)

对于您的用例而言,内爆比JSON和序列化要好,这不仅是因为它不仅速度更快,而且因为您不需要存储密钥,所以在案例中存储密钥很浪费。