数据库设计简介
首先我们应该知道数据库设计在整个软件开发的过程中处于一个什么样的位置。
数据库设计
就是根据业务系统的具体需求,结合我们所选用的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)
);
表结构模型图:
案例
由图我们大致可以建立四张表:
- 专辑表
- 曲目表
- 短评表
- 用户表
接下来我们再确定每张表之间的关系:
- 一个专辑可以有多个曲目,一个曲目只能属于某一张专辑,所以专辑表和曲目表的关系是一对多。
- 一个专辑可以被多个用户进行评论,一个用户可以对多个专辑进行评论,所以专辑表和用户表的关系是 多对多。
- 一个用户可以发多个短评,一个短评只能是某一个人发的,所以用户表和短评表的关系是 一对多。