如何将数组存储到 mysql 中?

2022-08-30 10:34:29

有没有办法将数组存储到mysql字段中?我正在创建一个评论评级系统,因此我想存储用户ID数组以防止多次投票。我将创建一个新表,其中包含注释ID和对此注释进行投票的用户ID数组。然后,我将加入注释表和此表,并检查当前用户 ID 是否存在于 voters 数组或注释中。如果是这样,投票图标将被禁用。我想我会阻止以这种方式循环使用mysql查询。

你碰巧知道更好的方法吗?


答案 1

您可能希望按如下方式解决此问题:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id)
);

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id)
);

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id)
);

交集表上的复合主键将阻止用户对同一注释进行多次投票。(comment_id, user_id)comments_votes

让我们在上面的架构中插入一些数据:

INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');

INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');

现在,让我们为用户 1 添加一些投票:

INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);

上述情况表示用户 1 对注释 1 和 2 进行了类型 1 的投票。

如果同一用户尝试对其中一条评论再次投票,数据库将拒绝它:

INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'

如果您将使用 InnoDB 存储引擎,则在交集表的 和 字段上使用外键约束也是明智的。但请注意,MyISAM(MySQL 中的默认存储引擎)不强制实施外键约束:comment_iduser_id

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id)
) ENGINE=INNODB;

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id)
) ENGINE=INNODB;

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id),
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
    FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;

这些外键保证 中的行永远不会分别具有 和 表中不存在的 或 值。外键不需要具有工作关系数据库,但它们对于避免断开关系和孤立行(即参照完整性)。comments_votescomment_iduser_idcommentsusers

实际上,如果要将序列化数组存储到单个数据库字段中,则引用完整性将很难强制实施。


答案 2

您始终可以序列化数组并将其存储在数据库中。
PHP 序列化

然后,您可以在需要时取消序列化数组。


推荐