我有一个Android应用程序,用户可以"like/unlike"
发帖,
我创建了一个表:
| id | post_id | user_id |
| 1 | 105 | 67 |
| 2 | 76 | 56 |
| 3 | 36 | 102 |
带有id自动递增的,这个表结构是否正确?
因为一个人可以喜欢/不喜欢多次,你认为删除行(不像)+创建新行(喜欢)是不错的做法?
如果有很多用户,自动增量行会增加并达到大数,这是不是很糟糕?因为自动增量不能重复使用已删除的行。
如果我添加了额外的boolean
列like
,其值为1
或0
并考虑表+中没有现有行的用户
用户具有现有行,但列like = 0
与
答案 0 :(得分:0)
你认为删除行(不像)+创建新行(比如)是不错的做法?
这种设计有一个缺陷。假设,用户不喜欢。但是表格中没有对应的行。所以没有什么可以删除。
您将无法存储有关不喜欢的信息。
如果有很多用户,自动增量行会增加并达到大数,这是不是很糟糕?
此处不需要自动增量列。使用复合主键:
post_id - PK, FK to posts table
user_id - PK, FK to users table
like - boolean (0 - dislike, 1 -like)
在这种情况下,您将能够存储所有信息。并且您可以免受自动增量列到期的影响。
如果您不需要保留不同于帖子的值,并且用户在他喜欢之前不能与帖子不同。最简单的解决方案是创建一个简单的映射表:
post_id - PK, FK to posts table
user_id - PK, FK to users table
当用户喜欢帖子时,请添加一行。如果他不喜欢,请删除该行。
答案 1 :(得分:0)
简单
Create table like(
user_id int,
post_id int,
Constraint pk_like primary key (user_id, post_id),
Constraint fk_user foreign key (user_id) references UserTable(id),
Constraint fk_post foreign key (post_id) references PostTable(id)
);
如果用户喜欢你添加一行,
Insert into like values (@userId,@postId);
如果他像他一样不喜欢你删除
Delete from like where user_id = @userId and post_id = @post_id;
如果"不像"存在于你的应用程序中,你应该添加一个bool列1 if if和0如果不同,如果你有更多喜欢和不喜欢,例如:hate,love,ungry。
#Call in query to like(1), unlike(2), hate(3)
call sp_Like(@userID,@postId,1);
#To dont like,unlike,hate,etc anymore you send (-1) in likeType.
call sp_Like(@userID,@postId,-1);
#This is your query
call sp_Like(@userID,@postId,likeType);
Create table yourDB.like(
user_id int,
post_id int,
likeType int,
Constraint pk_like primary key (user_id, post_id),
Constraint fk_user foreign key (user_id) references UserTable(id),
Constraint fk_post foreign key (post_id) references PostTable(id)
);
DELIMITER $$
USE yourDB$
DROP PROCEDURE IF EXISTS yourDB.sp_Like$$
CREATE PROCEDURE yourDB.sp_Like
(
IN ruser_id int,
IN rpost_id int,
IN rlikeType int
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
ROLLBACK;
SHOW ERRORS LIMIT 1;
select "-1" as "response";
END;
START TRANSACTION;
#check if he done like before
If exists(select post_id from like where user_id = ruser_id and post_id = rpost_id)
Then
#if user doesnt like or unlike, love, hate, anymore
If rlikeType = -1 then delete from like where
user_id = ruser_id and post_id = rpost_id;
else
#if user change like type
Update like set likeType = rlikeType where user_id = ruser_id and post_id = rpost_id;
end if;
Else
#if he doesnt like yet
Insert into like values (ruser_id,rpost_id,rlikeType);
End if;
select "1" as "response";
COMMIT;
END$$
DELIMITER ;