JavaWeb——MySQL-多表设计(3/5):(一对一关系,多对多关系,小结)

目录

一对一关系剖析

一对一关系场景与特点

数据库实现方式

图形化工具演示与验证

多对多关系解析

多对多关系实例与困境

中间表解决方案

工具演示与理解深化

多表关系核心要点回顾


一对一关系剖析

一对一关系场景与特点

        以用户与身份证为例,呈现一对一典型场景。

        在业务系统中,为优化数据操作效率,常拆分含多种信息的大表。如用户表含基本与身份信息,若基本信息查询频繁、身份信息查询低频,可拆为用户基本信息表(含用户 ID、姓名、性别等)与用户身份信息表(含民族、生日、身份证号等),两表依用户 ID 构建一对一关系,提升查询性能,精准定位数据,减轻数据库 I/O 负担,加速系统响应。

数据库实现方式

  • 外键关联

        于任意一方表设外键关联对方主键,如在用户身份信息表设外键user_id指向用户基本信息表主键。此关联建立两表逻辑纽带,确保数据关联完整性,精准定位关联数据,维护用户与身份证对应关系,为数据一致性提供基础支撑。

  • 唯一约束强化

        为外键字段添UNIQUE约束,杜绝重复值,严格保证一对一映射。如插入或更新数据时,数据库依此约束检查,防一个用户关联多个身份证,保障数据准确性与业务规则一致性,避免数据冗余与逻辑冲突。

图形化工具演示与验证


-- ===一对一===
create table tb_user
(
    id     int unsigned primary key auto_increment comment 'ID',
    name   varchar(10) not null comment '姓名',
    gender tinyint unsigned not null comment '性别, 1 男  2 女',
    phone  char(11) comment '手机号',
    degree varchar(10) comment '学历'
) comment '用户信息表';

insert into tb_user
values (1, '白眉鹰王', 1, '18812340001', '初中'),
       (2, '青翼蝠王', 1, '18812340002', '大专'),
       (3, '金毛狮王', 1, '18812340003', '初中'),
       (4, '紫衫龙王', 2, '18812340004', '硕士');


create table tb_user_card
(
    id           int unsigned primary key auto_increment comment 'ID',
    nationality  varchar(10) not null comment '民族',
    birthday     date        not null comment '生日',
    idcard       char(18)    not null comment '身份证号',
    issued       varchar(20) not null comment '签发机关',
    expire_begin date        not null comment '有效期限-开始',
    expire_end   date comment '有效期限-结束',
    user_id      int unsigned not null unique comment '用户ID',
    constraint fk_user_id foreign key (user_id) references tb_user (id)
) comment '用户信息表';

insert into tb_user_card
values (1, '汉', '1960-11-06', '100000100000100001', '朝阳区公安局', '2000-06-10', null, 1),
       (2, '汉', '1971-11-06', '100000100000100002', '静安区公安局', '2005-06-10', '2025-06-10', 2),
       (3, '汉', '1963-11-06', '100000100000100003', '昌平区公安局', '2006-06-10', null, 3),
       (4, '回', '1980-11-06', '100000100000100004', '海淀区公安局', '2008-06-10', '2028-06-10', 4);

        借图形化工具(如 IDEA)实操,先依设计创建用户基本信息表与身份信息表并插入测试数据。查看身份信息表结构,可见外键user_id关联用户基本信息表主键。

尝试修改外键值违反唯一约束时,数据库报错阻止操作,确保一对一关系稳固,

直观呈现数据库对关系约束的强制保障机制,助开发者理解与运用一对一关系设计。

多对多关系解析

多对多关系实例与困境

        以学生与课程关系阐述多对多常见情境,如学生可选多门课、课程可被多学生选。若用外键直接关联学生表与课程表实现关系,设计与维护棘手。如在学生表添外键关联课程主键,无法记录学生所选多门课;于课程表设外键关联学生主键,亦难处理一门课对应多学生,易致数据冗余、更新异常与查询复杂,使数据库管理混乱、性能下降。

中间表解决方案

  • 中间表构建

        借中间表化解难题,该表含至少两个外键字段,分别关联学生表与课程表主键,如设student_idcourse_id。其像桥梁精准维护多对多关系,使数据组织清晰、逻辑简明,有效解决数据冗余与更新难题,提升数据库管理效率与数据质量。

  • 查询原理阐释

        查询时,先据中间表外键关系锁定关联记录,再从对应表取所需信息。如查学生所选课程,先在中间表找该生student_id记录该课程course_id,再依course_id从课程表查课程详情;查课程被选学生同理,依course_id找中间表记录student_id,据此从学生表查学生信息,实现多对多关系下数据灵活精准查询。

工具演示与理解深化

仍以图形化工具演示,依序创建学生表(含idnamenumber)、课程表(含idname)及含外键关联的中间表,

--  ======================================多对多=============================
create table tb_student
(
    id   int auto_increment primary key comment '主键ID',
    name varchar(10) comment '姓名',
    no   varchar(10) comment '学号'
) comment '学生表';
insert into tb_student(name, no)
values ('黛绮丝', '2000100101'),
       ('谢逊', '2000100102'),
       ('殷天正', '2000100103'),
       ('韦一笑', '2000100104');


create table tb_course
(
    id   int auto_increment primary key comment '主键ID',
    name varchar(10) comment '课程名称'
) comment '课程表';
insert into tb_course (name)
values ('Java'),
       ('PHP'),
       ('MySQL'),
       ('Hadoop');


create table tb_student_course
(
    id         int auto_increment comment '主键' primary key,
    student_id int not null comment '学生ID',
    course_id  int not null comment '课程ID',
    constraint fk_courseid foreign key (course_id) references tb_course (id),
    constraint fk_studentid foreign key (student_id) references tb_student (id)
) comment '学生课程中间表';

insert into tb_student_course(student_id, course_id)
values (1, 1),
       (1, 2),
       (1, 3),
       (2, 2),
       (2, 3),
       (3, 4);

        查看数据可发现中间表记录完整映射学生与课程关系。

借数据库可视化功能展示表结构与关联,直观呈现多对多关系实现架构,助开发者清晰把握中间表核心作用与数据交互流程,提升多表设计实践能力。

多表关系核心要点回顾

        一对一关系可视为特殊一对多,于一方设外键关联对方主键并添唯一约束保障。多对多则需中间表,其外键分别连相关表主键,精准维护复杂关系。精准把握这些设计要点,是构建高效数据库架构、确保数据有效组织管理与流畅交互的基石,为系统稳定运行提供有力支撑。


END


学习自:黑马程序员——JavaWeb课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值