Mysql:用于发布'喜欢'和'不喜欢'的表格结构设计

时间:2016-06-19 07:22:53

标签: php android mysql database database-design

我有一个Android应用程序,用户可以"like/unlike"发帖,

我创建了一个表:

| id | post_id | user_id |
|  1 |     105 |      67 |
|  2 |      76 |      56 |
|  3 |      36 |     102 |
带有id自动递增的

,这个表结构是否正确?

因为一个人可以喜欢/不喜欢多次,你认为删除行(不像)+创建新行(喜欢)是不错的做法?

如果有很多用户,自动增量行会增加并达到大数,这是不是很糟糕?因为自动增量不能重复使用已删除的行。

如果我添加了额外的booleanlike,其值为10

并考虑表+中没有现有行的用户 用户具有现有行,但列like = 0

不同 那会更好吗?

2 个答案:

答案 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 ;