我需要在表中的一个字段中存储多个 id,或者添加另一个表来存储 id。
每个成员基本上都会有喜欢的文章。每篇文章都有一个 ID,当用户单击“添加到收藏夹”按钮时存储该 ID。
我的问题是:
我是创建一个字段并在此字段中添加多个 id,还是创建一个表来添加这些 id?
做这个的最好方式是什么?
这是一个多对多的关系,您需要一个额外的表来存储 user_id 和 article_id 对(分别是 user 和 article 表的主键)。
您应该创建一个新表,而不是在单个列中使用逗号分隔值。
保持数据库规范化。
您创建一个单独的表,这就是关系数据库中的工作方式。另一种解决方案(一列中以逗号分隔的 id 列表)将导致数据库无法维护。例如,如果您想知道一篇文章被收藏了多少次怎么办?您不能在这样的列上编写查询。
您的表将需要存储用户的 id 和文章的 id - 这些是指相应表的主键。对于查询,您可以使用JOIN
s 或嵌套SELECT
查询。
正如 lafor 已经指出的,这是一个多对多的关系,您最终会得到三个表:用户、文章和收藏夹:
CREATE TABLE user(
id INT NOT NULL,
...
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE article (
id INT NOT NULL,
...
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE favorite (
userID INT NOT NULL,
articleID INT NOT NULL,
FOREIGN KEY (userID) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY (articleID) REFERENCES article(id) ON DELETE CASCADE,
PRIMARY KEY (userID, articleID)
) ENGINE=INNODB;
如果您想选择所有用户最喜欢的文章,请使用 JOIN:
SELECT * FROM favorite f JOIN article a ON f.articleID = a.id WHERE f.userID = ?
If you want to know why you should use this schema, I recommend reading about database normilization. With multiple IDs in a single field you would even violate the first normal form and thus land in a world of pain...