📃
jdk
  • Introduction
  • 设计模式
  • 多线程
    • 多线程_基础篇
    • 多线程_锁
    • 多线程_JUC原子类
    • 多线程_JUC锁集合
    • 多线程_JUC集合
    • 多线程_JUC线程池
    • 多线程_生产者消费者
  • IDEA快捷键
  • Spring注解
    • Spring注解_介绍
    • Spring注解_常用注解
    • Spring注解_Spring入门篇
  • Java基础
    • Java基础_集合
    • Java基础_泛型
    • Java基础_打jar包
    • Java基础_正则匹配
    • Java基础_反射机制
    • Java基础_对象正反序列化
    • Java基础_读取配置文件
    • Java基础_解析与生成XML
    • Java基础_后台服务器开发
    • Java基础_四舍五入
  • Java进阶
    • Java进阶_反射
    • Java进阶_注解
  • MySQL
    • MySQL_基础
    • MySQL_约束
    • MySQL_多表查询
    • MySQL_事务
    • MySQL_数据库设计
  • JDBC
    • JDBC_JDBC基础
    • JDBC_JDBC连接池
    • JDBC_JDBCTemplate
  • Spark集群搭建
Powered by GitBook
On this page
  • 表间关系
  • 关系分类
  • 案例
  • 设计范式
  • 基本概念
  • 示例
  • 数据库备份和还原

Was this helpful?

  1. MySQL

MySQL_数据库设计

PreviousMySQL_事务NextJDBC

Last updated 2 years ago

Was this helpful?

[TOC]


表间关系

关系分类

  1. 一对一(了解):

  2. 如:人和身份证

  3. 分析:一个人只有一个身份证,一个身份证只能对应一个人

  4. 实现方式:一对一关系实现,可以在任意一方添加唯一外键指向另一方的主键

  5. 一对多(多对一):

    • 如:部门和员工

    • 分析:一个部门有多个员工,一个员工只能对应一个部门

    • 实现方式:在多的一方建立外键,指向一的一方的主键

  6. 多对多:

    • 如:学生和课程

  7. 分析:一个学生可以选择很多门课程,一个课程也可以被很多学生选择

    • 实现方式:多对多关系实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键

案例

-- 创建旅游线路分类表 tab_category
-- cid 旅游线路分类主键,自动增长
-- cname 旅游线路分类名称非空,唯一,字符串 100
CREATE TABLE tab_category (
  cid INT PRIMARY KEY AUTO_INCREMENT,
  cname VARCHAR(100) NOT NULL UNIQUE
);

-- 创建旅游线路表 tab_route
/*
   rid 旅游线路主键,自动增长
   rname 旅游线路名称非空,唯一,字符串 100
   price 价格
   rdate 上架时间,日期类型
   cid 外键,所属分类 */
CREATE TABLE tab_route(
  rid INT PRIMARY KEY AUTO_INCREMENT,
  rname VARCHAR(100) NOT NULL UNIQUE,
  price DOUBLE,
  rdate DATE,
  cid INT,
  FOREIGN KEY (cid) REFERENCES tab_category(cid)
);

/*创建用户表 tab_user
   uid 用户主键,自增长
   username 用户名长度 100,唯一,非空
   password 密码长度 30,非空
   name 真实姓名长度 100
   birthday 生日
   sex 性别,定长字符串 1
   telephone 手机号,字符串 11
   email 邮箱,字符串长度 100 */
CREATE TABLE tab_user (
  uid INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(100) UNIQUE NOT NULL,
  PASSWORD VARCHAR(30) NOT NULL,
  NAME VARCHAR(100),
  birthday DATE,
  sex CHAR(1) DEFAULT '男',
  telephone VARCHAR(11),
  email VARCHAR(100)
);

/*创建收藏表 tab_favorite
   rid 旅游线路 id,外键
   date 收藏时间
   uid 用户 id,外键
   rid 和 uid 不能重复,设置复合主键,同一个用户不能收藏同一个线路两次 */
CREATE TABLE tab_favorite (
  rid INT, -- 线路id
  DATE DATETIME,
  uid INT, -- 用户id
  -- 创建复合主键
  PRIMARY KEY(rid,uid), -- 联合主键
  FOREIGN KEY (rid) REFERENCES tab_route(rid),
  FOREIGN KEY(uid) REFERENCES tab_user(uid)
);

设计范式

基本概念

概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。 目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

分类:

  1. 第一范式(1NF):每一列都是不可分割的原子数据项

  2. 第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于码(在1NF基础上消除非主属性对主码的部分函数依赖)

  3. 函数依赖:A-->B,如果通过A属性(属性组)的值,可以确定唯一B属性的值。则称B依赖于A

    例如:学号-->姓名

  4. 完全函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定需要依赖于A属性组中所有的属性值。

    例如:(学号, 课程名称) --> 分数

  5. 部分函数依赖:A-->B, 如果A是一个属性组,则B属性值得确定只需要依赖于A属性组中某一些值即可。

    例如:(学号, 课程名称) -- > 姓名

  6. 传递函数依赖:A-->B, B -- >C . 如果通过A属性(属性组)的值,可以确定唯一B属性的值,在通过B属性(属性组)的值可以确定唯一C属性的值,则称 C 传递函数依赖于A

    例如:学号-->系名,系名-->系主任

  7. 码:如果在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性组)为该表的码

    例如:该表中码为:(学号, 课程名称)

    • 主属性:码属性组中的所有属性

    • 非主属性:除了码属性组的属性

  8. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

示例

普通表

学号
姓名
系名
系主任
课程名称
分数

10010

张无忌

经济系

张三丰

高等数学

95

10010

张无忌

经济系

张三丰

大学英语

87

10010

张无忌

经济系

张三丰

计算机基础

65

10011

令狐冲

法律系

任我行

法理学

77

10011

令狐冲

法律系

任我行

大学英语

87

10011

令狐冲

法律系

任我行

法律社会学

65

10012

杨过

法律系

任我行

法律社会学

95

10012

杨过

法律系

任我行

法理学

97

10012

杨过

法律系

任我行

大学英语

99

1NF

学号
姓名
系名
系主任
课程名称
分数

10010

张无忌

经济系

张三丰

高等数学

95

10010

张无忌

经济系

张三丰

大学英语

87

10010

张无忌

经济系

张三丰

计算机基础

65

10011

令狐冲

法律系

任我行

法理学

77

10011

令狐冲

法律系

任我行

大学英语

87

10011

令狐冲

法律系

任我行

法律社会学

65

10012

杨过

法律系

任我行

法律社会学

95

10012

杨过

法律系

任我行

法理学

97

10012

杨过

法律系

任我行

大学英语

99

计算机系

殷天正

存在的问题:

  1. 存在非常严重的数据冗余(重复):姓名、系名、系主任

  2. 数据添加存在问题:添加新开设的系和系主任时,数据不合法

  3. 数据删除存在问题:张无忌同学毕业了,删除数据,会将系的数据一起删除。

2NF

选课表

学号
课程名称
分数

10010

高等数学

95

10010

大学英语

87

10010

计算机基础

65

10011

法理学

77

10011

大学英语

87

10011

法律社会学

65

10012

法律社会学

95

10012

法理学

97

10012

大学英语

99

学生表

学号
姓名
系名
系主任

10010

张无忌

经济系

张三丰

10011

令狐冲

法律系

任我行

10012

杨过

法律系

任我行

计算机系

殷天正

存在的问题:

  1. 数据添加存在问题:添加新开设的系和系主任时,数据不合法

  2. 数据删除存在问题:张无忌同学毕业了,删除数据,会将系的数据一起删除。

3NF

选课表

学号
课程名称
分数

10010

高等数学

95

10010

大学英语

87

10010

计算机基础

65

10011

法理学

77

10011

大学英语

87

10011

法律社会学

65

10012

法律社会学

95

10012

法理学

97

10012

大学英语

99

学生表

学号
姓名
系名

10010

张无忌

经济系

10011

令狐冲

法律系

10012

杨过

法律系

系表

系名
系主任

经济系

张三丰

法律系

任我行

计算机系

殷天正

刚刚所有的三个问题全部被解决掉!!!

数据库备份和还原

  1. 命令行:

    • 备份:

      mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
    • 还原:

      1. 登录数据库

      2. 创建数据库

      3. 使用数据库

      4. 执行文件 (source 文件路径)

  2. 图形化工具:

MySQL约束与设计
img