用户点赞、收藏频繁操作数据混乱问题

用户在点赞时频繁操作时,导致数据库点赞记录多条。
编码流程是用户点赞时,先去查询是否有点赞记录,有则取消点赞(删除点赞更新状态),反之点赞(新增点赞记录)。但是频繁操作时点赞记录会出现多条,点赞计数也会异常变动。
原因:没有事务,查询点赞记录返回前可能已有数据更新,但未查到数据。
解决方案:加上for update (select * from public_like for update)

### 收藏功能的数据库表设计最佳实践 #### 表结构概述 对于收藏这两种常见的社交互动行为,在设计相应的数据库表格时,应遵循一些基本原则来确保系统的可扩展性、性能以及数据的一致性。 #### 用户表 (users) 考虑到用户作为主体参与收藏操作,因此需要有一个`users`表用于存储用户的个人信息。此部分不在具体讨论范围内,但它是整个架构的基础组成部分之一[^1]。 #### 文章/帖子表 (posts/articles) 同样地,被收藏的对象也需要有对应的实体表示,这里假设为文章或帖子形式的内容,并创建名为 `posts` 或者 `articles` 的表来进行描述。这也不是本次重介绍的部分,不过它同样是不可或缺的一部分。 #### 记录表 (likes) 为了有效地追踪每一个动作并支持后续统计分析等功能,则需建立专门用来保存这些事件信息的新表——即`likes`: | 字段名 | 类型 | 描述 | |--| | id | INT(UNSIGNED)| 主键, 自增 | | user_id | INT(UNSIGNED)| 发起用户ID | | post_id | INT(UNSIGNED)| 被的文章/帖子ID | | created_at | TIMESTAMP | 记录创建时间 | 其中,`user_id` 和 `post_id` 应设置外键约束分别指向 `users(id)` 及 `posts(id)` ,以此保证参照完整性;同时可以考虑在这两个字段上加上联合唯一索引来防止重复的情况发生。 ```sql CREATE TABLE likes ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id BIGINT UNSIGNED NOT NULL, post_id BIGINT UNSIGNED NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (post_id) REFERENCES posts(id), UNIQUE INDEX unique_like(user_id, post_id) ); ``` #### 收藏夹表 (favorites) 类似于机制的设计思路,针对收藏功能也应当构建独立的数据模型——`favorites` 来承载此类交互活动的相关元数据: | 字段名 | 类型 | 描述 | |--| | id | INT(UNSIGNED)| 主键, 自增 | | user_id | INT(UNSIGNED)| 创建该收藏条目的用户ID | | post_id | INT(UNSIGNED)| 所收藏的文章/帖子ID | | title | VARCHAR(255) | 对于所收藏项的一个简短标题 | | note | TEXT | 用户自定义备注 | | created_at | TIMESTAMP | 添加到收藏的时间戳 | 同样的道理适用于这里的外键关系设定与去重措施实施。值得注意的是,“title” 和 “note” 这样的附加属性有助于提高用户体验质量,允许个人根据自己的喜好整理资料。 ```sql CREATE TABLE favorites ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, user_id BIGINT UNSIGNED NOT NULL, post_id BIGINT UNSIGNED NOT NULL, title VARCHAR(255), note TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (post_id) REFERENCES posts(id), UNIQUE INDEX unique_favorite(user_id, post_id) ); ``` 通过上述方式组织起来的信息不仅能满足基本业务逻辑的要求,而且便于后期维护升级工作开展的同时也为可能存在的高级特性预留了一定空间,比如基于标签分类管理等更精细化的操作模式探索提供了良好基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值