将数组插入MYSQL字段


Insert Array into MYSQL field

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

我的问题是:我这样做正确吗?如果没有,应该改进什么?朋友、家人、企业和其他应该是什么类型的MYSQL字段?

您应该做的是在Contacts表和任何相关表(User、Friends、Family、Business)之间创建一个映射表。其目的纯粹是在联系人和用户等之间创建一个链接,而不必执行您所说的操作,也不必使用压缩到varchar等字段中的数组。

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

例如,UserContacts表纯粹包含自己的主键(id)、用户的外键和联系人的外键。您可以为每种类型执行此操作,使您可以随时轻松地在任意数量的用户和联系人之间插入或修改映射,而不会损坏其他数据,也不会使用复杂的逻辑来分解以下内容:1,2,3,4,51|2|3|4|5:

id, user_id, contact_id

所以当你开始使用这个结构时,你会做这样的事情:

SELECT 
    Contacts.* 
    -- , Users.* -- if you want the user information
FROM UserContacts
LEFT JOIN Contacts ON (UserContacts.contact_id = Contacts.id)
LEFT JOIN Users ON (Users.id = UserContacts.user_id)

使用serialize()unserialize()函数。

请参阅以下关于如何在MySQL中存储数组的问题:将PHP数组保存到MySQL?

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

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

在存储之前序列化数组,在检索之后取消序列化。

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

用于检索:

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

然而,遵循其他答案来设置适当的多对多设计应该更明智。

尽管如此,我还是需要这种设计来解决一个不需要完整解决方案的小情况(例如,轻松存储/检索一些多选列表值,除了向用户显示之外,我永远不会查询或使用这些值)