P35 如何设计一个项目的数据库
糟糕的数据库设计
- 数据冗余、浪费空间
- 数据库插入和删除都会比较麻烦、异常
- 程序的性能差
良好的数据库设计
- 节省内存空间
- 保证数据库的完整性
- 方便我们开发系统
软件开发中,关于数据库的设计
- 分析需求:分析业务和需要处理的数据库需求
- 概要设计:设计关系图、ER图
设计数据库的步骤(个人步骤)
- 收集信息,分析需求
用户表
分类表
评论表
文章表
友链表
自定义表
说说表 - 标识实体(把需求落地到每个字段)
- 标识实体之间的关系
写博客user-blog
创建分类user-category
关注user-user
友链links
评论user-user-blog
P36 三大范式
为什么需要数据规范化
- 信息重复
- 更新异常
- 插入异常
- 删除异常
三大范式
第一范式
- 要求数据库的每一列都是不可分割的原子数据项
第二范式
- 前提是满足第一范式
- 每张表只做一件事情
第三范式
- 前提是满足第一范式和第二范式
- 数据表中的每一项数据都要和主键直接相关,而不能间接相关
规范数据库的设计
规范性和性能的问题
关联查询的表不得超过3张
- 考虑商业化需求(成本、用户体验),数据库的性能更加重要
- 在规范性能的问题时,需要适当考虑一下规范性
- 故意给某些表增加一些冗余的字段(从多表查询中变为单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
P37 数据库驱动和JDBC
Java操作
我们的程序会通过数据库驱动,和数据库连接
JDBC
SUN公司为了简化开发人员对数据库的统一操作,提供了Java操作数据库规范,称为JDBC
对于开发人员来说,我们只需要掌握JDBC接口操作。
java.sql/javax.sql
我们需要导入一个数据库驱动
mysql-connector-java-5.1.47.jar
P38 第一个JDBC程序
CREATE DATABASE `jdbcStudy` CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `jdbcStudy`;
CREATE TABLE `users`(
`id` INT PRIMARY KEY,
`NAME` VARCHAR(40),
`PASSWORD` VARCHAR(40),
`email` VARCHAR(60),
`birthday` DATE
);
INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)
VALUES(1,'zhangsan','123456','zs@sina.com','1980-12-04'),
(2,'lisi','123456','lisi@sina.com','1981-12-04'),
(3,'wangwu','123456','wangwu@sina.com','1979-12-04')
- 创建一个普通项目
- 导入数据库驱动
- 编写测试代码
package com.hu.lesson1;
import com.mysql.jdbc.Driver;
import java.sql.*;
// 我的第一个JDBC程序
public class JdbcFirstDemo {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.建立连接
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username = "root";
String password = "xxxx";
// 3.连接成功
Connection connection = DriverManager.getConnection(url, username, password);
// 4.执行SQL的对象
Statement statement = connection.createStatement();
// 5.执行SQL的对象去执行SQL,可能存在结果,要查询返回结果
String sql = "SELECT * FROM `users`";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id=" + resultSet.getObject("id"));
System.out.println("name=" + resultSet.getObject("NAME"));
System.out.println("pwd=" + resultSet.getObject("PASSWORD"));
System.out.println("email=" + resultSet.getObject("email"));
System.out.println("birthday=" + resultSet.getObject("birthday"));
}
// 6.释放连接
resultSet.close();
statement.close();
connection.close();
}
}
- 加载驱动
- 连接数据库
- 获得执行SQL的对象statement
- 获得返回的结果集
- 释放连接