数据库设计:如何让一个表字段关联另一张表的多条记录
用户收藏教授功能的数据库实现方案
首选方案:新增多对多关联表(符合关系型数据库设计规范)
用户和教授的收藏关系是典型的多对多关系,不需要在users表新增saved_professors字段,新增一张user_saved_professors关联表即可,表结构参考:
id:主键,选择INT/BIGINT自增类型即可user_id:外键,关联users表主键,非空professor_id:外键,关联professors表主键,非空saved_at:可选扩展字段,DATETIME/TIMESTAMP类型,记录用户收藏的时间戳
该方案的核心优势:
- 所有操作都可以用原生SQL实现:查询用户收藏的教授列表、判断用户是否收藏指定教授、统计教授的收藏量、删除单个收藏记录都不需要做额外的字符串处理
- 支持扩展关联属性:后续如果要加收藏分组、收藏置顶这类需求,直接在关联表加字段即可,迭代成本极低
- 数据一致性有保障:可以通过外键约束避免存储不存在的用户/教授ID,删除关联的主数据时可以级联清理收藏记录,不会产生脏数据
- 性能表现优异:给
user_id、professor_id加普通索引后,百万级数据量下的关联查询也不会有性能瓶颈
备选方案:单字段存储实现(仅适合特殊场景)
如果你的业务场景确实要求把收藏列表存在users表的单个字段里,不要用VARCHAR/TEXT存储拼接的ID字符串,可以根据你用的数据库类型选择更合适的格式:
- 如果你用PostgreSQL:直接选择
INT[]数组类型存储教授ID,PostgreSQL原生支持数组操作函数,还可以给数组字段建GIN索引提升查询性能 - 如果你用MySQL 8.0.17及以上版本:选择
JSON类型存储ID数组,支持原生JSON查询函数,还可以给数组元素创建多值索引,查询效率远高于字符串切割 - 如果你用更低版本的MySQL:优先还是选关联表方案,退而求其次选JSON类型,也比分隔字符串的可维护性高很多
内容的提问来源于stack exchange,提问作者Jacob Hornbeck
相关产品推荐
相关产品推荐

