如何将数组存储到 mysql 中?
有没有办法将数组存储到mysql字段中?我正在创建一个评论评级系统,因此我想存储用户ID数组以防止多次投票。我将创建一个新表,其中包含注释ID和对此注释进行投票的用户ID数组。然后,我将加入注释表和此表,并检查当前用户 ID 是否存在于 voters 数组或注释中。如果是这样,投票图标将被禁用。我想我会阻止以这种方式循环使用mysql查询。
你碰巧知道更好的方法吗?
有没有办法将数组存储到mysql字段中?我正在创建一个评论评级系统,因此我想存储用户ID数组以防止多次投票。我将创建一个新表,其中包含注释ID和对此注释进行投票的用户ID数组。然后,我将加入注释表和此表,并检查当前用户 ID 是否存在于 voters 数组或注释中。如果是这样,投票图标将被禁用。我想我会阻止以这种方式循环使用mysql查询。
你碰巧知道更好的方法吗?
您可能希望按如下方式解决此问题:
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_id
user_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_votes
comment_id
user_id
comments
users
实际上,如果要将序列化数组存储到单个数据库字段中,则引用完整性将很难强制实施。