我有一个名为user_thoughts
的表。该表有许多列,其中一列是 favourited_by
。
一个thought
可能被许多不同的用户收藏,但我不想创建一个新行,说明这个thought id
已被这个user
我宁愿让它在一个字段中存储多个username
。例如,favourited_by
可以保存这样的数据:
Alice, Fred, Freddy, Conor ....
全部在一行中。我尝试弄乱phpMyAdmin上的data types
,但无法弄清楚该字段如何容纳多个数据。
你问的是这样做的错误方法。不应将收藏夹数据序列化为user
表或thought
表的文本字段中。这破坏了使用像MySQL这样的关系数据库的全部目的。
执行此操作的正确方法:在user
表和thought
表之间创建一个交叉引用表。这利用多对多表来存储使用thought
行和user
行的主键的收藏夹列表。
您的新favorite
表:
CREATE TABLE IF NOT EXISTS `favorite` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`thought_id` int NOT NULL,
PRIMARY KEY (`id`)
);
这样做是从user
表中获取id
并将其存储在favorite.user_id
中,然后将thought
表中的id
存储在favorite.thought_id
中。
123 的用户添加新收藏夹,为 id 为 456 的思想
: INSERT INTO favorite (user_id, thought_id) VALUES ('123', '456');
获取已将 id 456 标记为自己喜欢的想法的用户(使用 JOIN
):
SELECT u.* FROM favorite AS f
JOIN user AS u ON u.id = f.user_id
WHERE f.thought_id = 456;
与上一个查询类似,获取 id 为 123 的用户最喜欢的想法:
SELECT t.* FROM favorite AS f
JOIN thought AS t ON t.id = f.thought_id
WHERE f.user_id = 123;
处理此问题的理想方法是将其映射到另一个表,但是您可以将其存储为 json。
MySQL 5.7甚至包括JSON作为数据类型,允许更容易的过滤和操作。
https://dev.mysql.com/doc/refman/5.7/en/json.html
您可以将 json 放入任何文本字段中,但是如果您不需要搜索它等。