字段中的数组的新表或字段(php / mysql)

时间:2012-11-23 14:23:09

标签: php mysql

我需要在表格的某个字段中存储多个id,或者添加另一个表来存储id。

每个成员基本上都会有喜欢的文章。每篇文章都有一个id,当用户点击Add to favorites按钮时会存储该ID。

我的问题是:

我是否创建了一个字段,并在此字段中添加多个ID,还是创建一个表来添加这些ID?

这样做的最佳方式是什么?

4 个答案:

答案 0 :(得分:3)

这是一个多对多的关系,你需要一个额外的表来存储user_id和article_id(分别是用户和文章表的主键)。

答案 1 :(得分:2)

您应该创建一个新表,而不是在一列中使用逗号分隔值。

保持数据库规范化。

答案 2 :(得分:1)

create a separate table,这就是关系数据库中的工作方式。另一个解决方案(一列中以逗号分隔的ID列表)将导致无法维护的数据库。例如,如果您想知道文章被收藏的次数怎么办?你不能在像这样的列上写查询。

您的表需要存储用户的id和文章的id - 这些是指相应表的主键。对于查询,您可以使用JOIN s或嵌套SELECT查询。

答案 3 :(得分:0)

正如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 = ?

如果您想知道为什么要使用此架构,我建议您阅读database normilization。如果在一个字段中有多个ID,您甚至会违反第一个正常形式,从而陷入痛苦的世界......