将数组插入MYSQL字段

时间:2013-12-10 21:33:01

标签: php mysql arrays

对于论坛,我想让用户互相发送消息。 为了做到这一点,我创建了一个名为Contacts的表,在这个表中我有5个collumns:user_id,一个用于存储Friends的列,一个用于存储Family,一个用于存储Business,另一个用于其他联系人。最后四个应该都包含一个数组,该数组包含该类型联系人的user_id。我选择这个设计的原因是因为我不想输入太多的东西或限制用户数量的朋友,比如friend1,friend2等。

我的问题是:我这样做是否正确?如果不是,应该改进什么?朋友,家人,商业和其他人应该选择什么类型的MYSQL字段?

3 个答案:

答案 0 :(得分:1)

你应该做什么而不是在你的联系人表和任何相关表(用户,朋友,家人,商业)之间有一个地图表。目的只是在你的联系人和你的用户等之间建立一个链接,而不必做你正在谈论的事情,并使用压缩到varchar等领域的数组。

结构化数据方法为您提供了更灵活的应用程序。

E.g。 UserContacts表纯粹包含自己的主键(id),用户的外键和Contacts的外键。您可以为每种类型执行此操作,从而可以随时轻松地插入或修改任意数量的用户和联系人之间的地图,而不会对其他数据造成潜在损害 - 并且没有复杂的逻辑来分解这样的内容:1,2,3,4,5或{ {1}}:

1|2|3|4|5

那么当你来使用这个结构时,你会做这样的事情:

id, user_id, contact_id

答案 1 :(得分:0)

使用serialize()unserialize()功能。

请参阅此问题,了解如何在MySQL中存储数组: Save PHP array to MySQL?

但是,不建议您这样做。我会创建一个单独的表来存储两个用户之间的所有“连接”。例如,如果说约翰加上阿里,就会有一张献给阿里和约翰的纪录。要查找用户的朋友,只需查询其中包含Ali或John的记录。但那是我个人的做事方式。

我建议您在需要时使用PHP / MySQL查询用户朋友。这可以节省相当大的空间,并且不会占用太多的速度。

答案 2 :(得分:0)

在检索之前序列化数组,然后在检索之后反序列化。

$friends_for_db = serialize($friends_array);
// store $friends_for_db into db

用于检索:

// read $friends_for_db from db
$friends_array = unserialize($friends_for_db);

但是,关于设置适当的多对多设计的其他答案应该更明智。

然而,我需要这种设计用于一个小的情况,不需要完整的解决方案(例如,容易存储/检索一些我不会查询或使用的多选列表值,除了显示到用户)