前言
数据库设计就是建立数据库中的表结构以及表与表之间的关联关系的过程。
简而言之,就是有哪些表、表里有哪些字段以及表和表之间有什么关系。其中,表关系有:一对一、一对多和多对多。
1.一对一
一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能。
实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)。
示例:
create table user_desc (
id int primary key auto_increment,
city varchar(20),
edu varchar(10),
income int,
status char(2),
des varchar(100)
);
create table 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 user_desc(id)
);
2.一对多
一对多 如:部门 和 员工
一个部门对应多个员工,一个员工对应一个部门。
实现方式:在多的一方建立外键,指向一的一方的主键
示例:
-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE 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 dept(id)
);
3.多对多
多对多 如:商品 和 订单
一个商品对应多个订单,一个订单包含多个商品
实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
示例:
-- 删除表
DROP TABLE IF EXISTS order_goods;
DROP TABLE IF EXISTS order;
DROP TABLE IF EXISTS goods;
-- 订单表
CREATE TABLE order(
id int primary key auto_increment,
payment double(10,2),
payment_type TINYINT,
status TINYINT
);
-- 商品表
CREATE TABLE goods(
id int primary key auto_increment,
title varchar(100),
price double(10,2)
);
-- 订单商品中间表
CREATE TABLE order_goods(
id int primary key auto_increment,
order_id int,
goods_id int,
count int
);
-- 建完表后,添加外键
alter table order_goods add CONSTRAINT fk_order_id FOREIGN key(order_id) REFERENCES
order(id);
alter table order_goods add CONSTRAINT fk_goods_id FOREIGN key(goods_id) REFERENCES
goods(id);