MySQL实现用户多收藏列表关联及REST API开发需求问询
搭建中大型项目REST API:用户与收藏列表多对多关联方案
嘿,作为常年在Android开发和后端API之间来回折腾的老鸟,我来给你梳理一套清晰的实现思路!针对你提到的用户与收藏列表的多对多关联需求,咱们从数据库设计、API接口到Android端适配一步步来:
一、数据库表设计:搞定多对多关联
你已经有了User和Favourite List两张表,要实现“一个用户收藏多个列表、一个列表被多个用户收藏”的关系,必须新增一张中间关联表——这是关系型数据库处理多对多的标准方案,比在User表存逗号分隔的list_id靠谱一万倍(后者会让查询、维护、扩展全变噩梦)。
推荐的表结构:
User表(原表保留)
user_id(主键)user_namepassword(注意:生产环境一定要存哈希后的密码,别明文!)
Favourite_List表(原表保留)
list_id(主键)list_name
User_Favourite_Join表(新增中间表)
user_id(外键关联User.user_id)list_id(外键关联Favourite_List.list_id)- 把
user_id + list_id设为联合主键(确保同一个用户不会重复收藏同一个列表)
这样设计的好处:
- 完全符合数据库第三范式,数据无冗余
- 方便查询:比如要找某个用户的所有收藏列表,直接关联三张表就能快速查出
- 易于扩展:后续要加收藏时间、排序权重这类字段,直接在中间表加就行
二、REST API接口设计:核心端点示例
针对收藏功能,你需要设计几个核心接口,遵循RESTful规范:
1. 获取指定用户的所有收藏列表
- HTTP方法:GET
- 路径:
/api/users/{userId}/favourites - 响应示例:
{ "code": 200, "message": "success", "data": [ { "list_id": 1, "list_name": "科技新闻精选" }, { "list_id": 3, "list_name": "每日财经要闻" } ] }
- 注意:如果用户未收藏任何列表,返回空数组而非错误;要做权限校验,确保请求者只能访问自己的收藏(比如通过Token验证userId是否匹配当前登录用户)
2. 给指定用户添加收藏列表
- HTTP方法:POST
- 路径:
/api/users/{userId}/favourites - 请求体:
{ "list_id": 12 }
- 响应状态码:
- 201 Created:收藏成功
- 400 Bad Request:列表不存在或已收藏
- 404 Not Found:用户不存在
3. 取消指定用户的某个收藏列表
- HTTP方法:DELETE
- 路径:
/api/users/{userId}/favourites/{listId} - 响应状态码:
- 200 OK:取消成功
- 404 Not Found:用户或收藏关系不存在
4. (可选)批量添加/取消收藏
如果Android端需要批量操作,可以加这个接口:
- HTTP方法:POST(批量添加)/ DELETE(批量取消)
- 路径:
/api/users/{userId}/favourites/batch - 请求体:
{ "list_ids": [12, 33, 56] }
三、Android端开发建议
作为Android开发者,你肯定关心怎么对接这些API:
- 用Retrofit封装API请求:定义清晰的接口方法,比如
@GET("api/users/{userId}/favourites") Call<FavouriteListResponse> getUserFavourites(@Path("userId") String userId); - 处理异步请求:用Coroutines或者RxJava处理网络请求,避免阻塞主线程
- 本地缓存:用Room数据库缓存用户的收藏列表,下次打开App先读本地,再同步服务器数据,提升体验
- 状态同步:收藏状态变更后(比如用户点击收藏/取消),要及时更新UI和本地缓存,再调用API同步到服务器
- 错误处理:针对API返回的错误状态码,给用户友好提示(比如“该列表已收藏”“网络异常,请稍后重试”)
四、额外优化点(中大型项目必备)
- 数据库索引:给中间表的
user_id和list_id单独加索引,提升查询速度(当用户量和收藏量上来后,这点很重要) - 分页查询:如果用户收藏的列表超过几十条,接口要支持分页,比如加
page和size参数:/api/users/{userId}/favourites?page=1&size=20 - 身份验证:所有接口要加Token验证,比如在请求头里带
Authorization: Bearer {token},防止非法访问 - 接口幂等性:添加收藏的接口要保证幂等(比如重复调用不会创建多条记录),联合主键已经帮你做到了这一点
希望这些思路能帮你快速搭建起稳定的REST API!如果还有具体的技术细节(比如用什么后端框架、怎么处理Token),随时问~
内容的提问来源于stack exchange,提问作者user3469764
相关产品推荐
相关产品推荐

