商品价格提醒列表数据库设计咨询:多产品关联方案
解决方案:用多对多关联表替代单字段存储多产品ID
你当前在list表中用单个字段存储多个product_id的设计违反了数据库设计范式,会带来查询效率低、维护困难、数据一致性差等问题。正确的做法是通过新增一张多对多关联表来维护列表与产品的关系,具体如下:
调整后的表结构
1. user表(保持原有结构,建议统一字段命名规范)
user_id (主键) username email password created_on created_by
2. list表(移除product_ids字段,聚焦列表本身属性)
list_id (主键) user_id (外键,关联user.user_id) list_name created_on
3. product表(保持原有结构)
product_id (主键) product_name product_price last_updated created_on stock_status product_url
4. 新增list_product关联表(核心:维护列表与产品的多对多关系)
list_id (外键,关联list.list_id) product_id (外键,关联product.product_id) added_on (可选,记录产品加入列表的时间) -- 联合主键:list_id + product_id,确保同一产品不会重复加入同一列表
关键查询示例
获取指定用户某列表下的所有产品
SELECT p.* FROM list l INNER JOIN list_product lp ON l.list_id = lp.list_id INNER JOIN product p ON lp.product_id = p.product_id WHERE l.user_id = '目标用户ID' AND l.list_id = '目标列表ID';
查询某产品被加入了哪些用户的列表
SELECT u.username, l.list_name FROM product p INNER JOIN list_product lp ON p.product_id = lp.product_id INNER JOIN list l ON lp.list_id = l.list_id INNER JOIN user u ON l.user_id = u.user_id WHERE p.product_id = '目标产品ID';
这种设计的优势
- 数据一致性:通过外键约束确保关联的
list_id和product_id都是真实存在的,避免无效ID - 查询高效:无需使用
LIKE或字符串分割操作,利用索引快速关联数据 - 维护便捷:添加/移除列表中的产品只需在
list_product表中增删记录,无需修改list表 - 扩展性强:后续可轻松添加产品加入列表的备注、优先级等属性到关联表中
内容的提问来源于stack exchange,提问作者JDoug98
相关产品推荐
相关产品推荐

