MySQL高级②(数据库设计)
2023-09-27 14:26:45 时间
数据库设计简介
首先我们应该知道数据库设计在整个软件开发的过程中处于一个什么样的位置。
数据库设计
就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。
说白了就是:有哪些表?表里有哪些字段?表和表之间有什么关系?
数据库设计的步骤:
- 需求分析(数据是什么? 数据具有哪些属性? 数据与属性的特点是什么)
- 逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库管理系统)
- 物理设计(根据数据库自身的特点把逻辑设计转换为物理设计)
- 维护设计(1.对新的需求进行建表;2.表优化)
如下图就是一个论坛数据库ER(Entity/Relation)图:
表关系:
-
一对一
使用场景:一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
例如:用户 和 用户详情 -
一对多
例如:部门 和 员工(一个部门对应多个员工,一个员工对应一个部门) -
多对多
例如:商品 和 订单(一个商品对应多个订单,一个订单包含多个商品)
表关系实现
一对多
实现方式:在多的一方建立外键,指向一的一方的主键。
例如:
员工表属于多的一方,而部门表属于一的一方,此时我们会在员工表中添加一列(dep_id),指向于部门表的主键(id):
-- 删除表
DROP TABLE IF EXISTS tb_emp;
DROP TABLE IF EXISTS tb_dept;
-- 部门表
CREATE TABLE tb_dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE tb_emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES tb_dept(id)
);
注意:主表要先创建,否则在员工表中添加外键约束的时候会失败。
表结构模型图:
多对多
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键。
例如:
注意在不同的业务里面,中间表扮演的角色也不同。
就比如在商品和订单这个业务里面,中间表不止记录了关联的关系,还可以记录相关的业务字段,比如我们可以在中间表里面加入购买的数量字段
代码实现:
-- 删除表
DROP TABLE IF EXISTS tb_order_goods;
DROP TABLE IF EXISTS tb_order;
DROP TABLE IF EXISTS tb_goods;
-- 订单表
CREATE TABLE tb_order(
id int primary key auto_increment,
payment double(10,2),
payment_type TINYINT,
status TINYINT
);
-- 商品表
CREATE TABLE tb_goods(
id int primary key auto_increment,
title varchar(100),
price double(10,2)
);
-- 订单商品中间表
CREATE TABLE tb_order_goods(
id int primary key auto_increment,
order_id int,
goods_id int,
count int
);
-- 建完表后,添加外键
alter table tb_order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES tb_order(id);
alter table tb_order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES tb_goods(id);
表结构模型图:
一对一
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
例如:
create table tb_user_desc (
id int primary key auto_increment,
city varchar(20),
edu varchar(10),
income int,
status char(2),
des varchar(100)
);
create table tb_user (
id int primary key auto_increment,
photo varchar(100),
nickname varchar(50),
age int,
gender char(1),
desc_id int unique,
-- 添加外键
CONSTRAINT fk_user_desc FOREIGN KEY(desc_id) REFERENCES tb_user_desc(id)
);
表结构模型图:
案例
由图我们大致可以建立四张表:
- 专辑表
- 曲目表
- 短评表
- 用户表
接下来我们再确定每张表之间的关系:
- 一个专辑可以有多个曲目,一个曲目只能属于某一张专辑,所以专辑表和曲目表的关系是一对多。
- 一个专辑可以被多个用户进行评论,一个用户可以对多个专辑进行评论,所以专辑表和用户表的关系是 多对多。
- 一个用户可以发多个短评,一个短评只能是某一个人发的,所以用户表和短评表的关系是 一对多。
相关文章
- 阿里华为P8级架构师教你MySQL数据库设计三范式与反范式
- 【数据库开发】如何创建MySQL数据库连接池(一个基于libmysql的MySQL数据库连接池示例(C/C++版))
- 【数据库开发】在Windows上和Linux上配置MySQL的过程
- JDBC 连接 MySQL 数据库
- Java Web数据库篇之MySQL特性
- Confluence设置MySQL数据库报错:必须使用'READ-COMMITTED'作为默认隔离级别。
- IntelliJ IDEA手动配置连接MySQL数据库
- MySQL高级第一章——架构介绍
- Windows设置一键安装Mysql数据库的方法
- MySQL数据库(1):数据库 Database 基本概念
- windows环境下mysql解压缩版安装
- [数据库]Windows:安装MySQL[解压版的安装/卸载]
- JSP 实现 之 调用java方法实现MySQL数据库备份和恢复
- 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结
- mysql服务器主从数据库同步配置(转)
- 数据库设计-Mysql数据库表设计的过程中几个关键点
- mysql数据库读写分离
- .sqlite文件转换mysql;sqlite数据库转换mysql数据库
- mysql 5.7 Could not load driverClass com.mysql.cj.jdbc.Driver
- 【基于Java+MySQL等技术的企业员工信息管理系统设计与实现】(源代码+数据库+论文+PPT+视频讲解部署 获取)
- 【基于SSM+JSP+MySQL的垃圾分类管理系统的设计与实现(持续改进与迭代中~)】
- 关于MySQL的权限控制
- MySQL 内置函数
- JDBC连接数据库出现Loading class `com.mysql.jdbc.Driver‘. This is deprecated.问题的相关解决方法
- mysql-unsha1:在未知密码情况下,登录任意MYSQL数据库
- MySQL 创建数据库
- MySQL基础教程——创建数据库并插入数据
- Python访问MySQL数据库
- Error loading MySQLdb module: No module named 'MySQLdb'----------- django成功连接mysql数据库的方法
- 4.2 图书借阅系统数据库设计 --MySQL