Kin*_*ien 47 php mysql database
有没有办法将数组存储到mysql字段?我正在创建一个评论评级系统,所以我想存储用户ID数组以防止多次投票.我将创建一个新表,其中包含注释ID和已对此注释进行投票的用户ID数组.我将加入评论表和此表,并检查当前用户ID是否存在于选民数组或注释中.如果确实如此,则会禁用投票图标.我想我会阻止以这种方式在循环中使用mysql查询.
你碰巧知道更好的方法吗?
Dan*_*llo 62
您可能希望解决此问题,如下所示:
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)
);
Run Code Online (Sandbox Code Playgroud)
交集表上的复合主键 将阻止用户在相同的注释上多次投票.(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');
Run Code Online (Sandbox Code Playgroud)
现在让我们为用户1添加一些投票:
INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
Run Code Online (Sandbox Code Playgroud)
以上意味着用户1对评论1和2进行了类型1的投票.
如果同一用户尝试再对其中一条评论进行投票,则数据库将拒绝该评论:
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)
如果您将使用InnoDB存储引擎,那么在交集表的字段和字段上使用外键约束也是明智的.但请注意,MySQL中的默认存储引擎MyISAM不会强制执行外键约束: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;
Run Code Online (Sandbox Code Playgroud)
这些外键保证一行中comments_votes永远不会有和表中不存在的值comment_id或user_id值.外键不需要具有工作关系数据库,但它们对于避免破坏关系和孤立行(即参照完整性)绝对必不可少.commentsusers
事实上,参照完整性是一些本来非常难以执行,如果你要序列化数组存储到一个单一的数据库字段.
Gra*_*ins 50
您始终可以序列化阵列并将其存储在数据库中.
PHP序列化
然后,您可以在需要时反序列化数组.
Pek*_*ica 13
考虑将表结构规范化为注释和单独的投票表.
表"评论":
id
comment
user
...
Run Code Online (Sandbox Code Playgroud)
表"投票":
user_id
comment_id
vote (downvote/upvote)
Run Code Online (Sandbox Code Playgroud)
这将允许无限数量的投票而无需处理数据库字段的限制.
此外,您可能有将来需要的操作,例如"显示用户已投票的所有投票",删除特定投票或限制每天的最大投票数.使用规范化结构实现这些操作非常简单快速,并且在序列化数组中非常慢且复杂.
您应该拥有三个表:users、comments 和 comment_users。
comment_users 只有两个字段:fk_user_id 和 fk_comment_id
这样你就可以将你的表现保持在最高水平:)
我更愿意标准化你的表结构,比如;
COMMENTS
-------
id (pk)
title
comment
userId
USERS
-----
id (pk)
name
email
COMMENT_VOTE
------------
commentId (pk)
userId (pk)
rating (float)
Run Code Online (Sandbox Code Playgroud)
现在维护起来更容易了!MySQL 只接受每个用户一票和评论。