在一个字段中存储多个数据(将数据存储在数据库的数组中)


Storing multiple data in one field (storing data in an array in database)

我有一个名为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中。

要为 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 放入任何文本字段中,但是如果您不需要搜索它等。