当前位置: 首页 > news >正文

MySQL一对多关系--多对多关系之间的区别

是的!你的理解完全正确。我来用更简单的语言和例子总结一下:


1. 一对多关系 → 父子表(外键关联)

核心逻辑:一个“父亲”(主表)对应多个“孩子”(子表)。
数据库实现:在“子表”中添加外键,指向“父表”的主键。

例子:用户(父表)和消息(子表)

用户表users):存储所有用户(每个用户是唯一的)。
消息表messages):存储用户发送的消息,每个消息必须属于某个用户。

-- 子表中添加外键 user_id
CREATE TABLE messages (
    message_id INT PRIMARY KEY,
    user_id INT,  -- 外键指向users表的user_id
    content TEXT,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

关系
• 一个用户(父)可以发多条消息(子)。
• 一条消息(子)只能属于一个用户(父)。


2. 多对多关系 → 关联表(中间表)

核心逻辑:多个记录相互关联(例如一个用户可以加入多个聊天室,一个聊天室可以包含多个用户)。
数据库实现:创建一个独立的关联表,存储两个表之间的关联关系。

例子:用户(users)和聊天室(chat_rooms

用户表users)和聊天室表chat_rooms)各自独立。
关联表user_rooms):

CREATE TABLE user_rooms (
    user_id INT,
    room_id INT,
    PRIMARY KEY (user_id, room_id),  -- 联合主键
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (room_id) REFERENCES chat_rooms(room_id)
);

关系
• 用户A可以加入聊天室1、聊天室2。
• 聊天室1可以包含用户A、用户B、用户C。


3. 常见误区

错误做法(不要这样做!):

在表中用逗号分隔多个ID
例如,在聊天室表中加一个字段 members,存储类似 "1,3,5" 的字符串。
问题:无法高效查询,违反数据库设计规范。

正确做法:

必须用关联表(如上面的user_rooms)!


4. 总结

关系类型现实例子数据库实现方式
一对多用户和消息、订单和商品子表加外键
多对多用户和聊天室、学生和课程独立的关联表(中间表)

记住这个口诀:
“一父多子用外键,多对多用中间表” 🚀

相关文章:

  • RCFile数据读取流程
  • 前缀和--
  • 消息中间件——RocketMQ(一)
  • 【复旦微FM33 MCU 底层开发指南】高级定时器ATIM
  • 齐次坐标系统:什么是齐次坐标?为什么要引入齐次坐标?
  • Go - 内存逃逸
  • C语言--实现图的基本操作
  • 探秘 LangChain 函数定义
  • Java 性能优化:从原理到实践的全面指南
  • #systemverilog# 关于基于systemveriog验证平台的RTL+TB文件编译顺序问题的讨论
  • c++11--std::forwaord--完美转发
  • zk源码-7.ZAB协议和数据存储二
  • arm_math.h、arm_const_structs.h 和 arm_common_tables.h
  • 游戏引擎学习第217天
  • Day14:关于MySQL的索引——创、查、删
  • 【腾讯云智】20250329笔试算法题
  • QT聊天项目开发DAY02
  • NIPS2024论文 End-to-End Ontology Learning with Large Language Models
  • SpringBoot-Web开发
  • 网络空间安全(56)Laravel框架讲解
  • 美国新泽西客运公司遭遇罢工:40年来首次,35万人受影响
  • 以军称已开始在加沙的新一轮大规模攻势
  • 多个“首次”!上市公司重大资产重组新规落地
  • 探秘多维魅力,长江经济带、珠三角媒体总编辑岳阳行启动
  • 江苏省委组织部副部长高颜已任南京市委常委、组织部部长
  • 上海市税务局:收到对刘某某存在涉税问题的举报,正依法依规办理