数据库设计以及和项目之间的关系
数据库设计以及和项目之间的关系(涉及JDBC)
规范数据设计
糟糕的数据库设计:
-
数据冗余,浪费空间
-
数据库插入和删除都会麻烦、异常[屏蔽使用物理外键)
-
程序的性能差
良好的数据库设计:
- 节省内存空间
- 保证数据库的完整性
- 方便我们开发系统
软件开发中,关于数据库的设计
- 分析需求: 分析业务和需要处理的数据库的需求
- 概要设计: 设计关系图 E-R 图
设计数据库的步骤(例如设计博客网站)
-
收集信息,分析需求(表的类型,每种表需要的信息)
- 用户表 (用户登录注销,用户的个人信息,写博客,创建分类)
- 分类表(文章分类,谁创建的)
- 文章表 (文章的信息)
- 自定义表(系统信息,某个关键的字,或者一些主字段) key : value
-
标识实体(落实需求字段,如设计用户表,里面有ID,name,text等对应的分别是什么)
-
标识实体之间的联系
- 写博客: user-->blog (要用到用户表和文章表)
- 创建分类: user-->category(要用到用户表和分类表)
- 关注: user-->user(要用到用户表和用户表)
- ..........
为什么要使用三大范式
为什么要数据规范化
为了防止以下情况
- 信息重复
- 更新异常
- 插入异常
- 无法正常显示信息
- 删除异常
- 丢失有效的信息
三大范式
第一范式(1NF)
原子性:每一列属性都是不可再分的属性值
第二范式(2NF)
总结:每张表只描述一件事
前提:满足第一范式
要求:每一行的数据只能与其中一列相关,即一行数据只做一件事。如果有联合主键,那必须和这几个主键都有关才行。
第三范式(3NF)
前提:满足第一第二范式
要求:表中的每一列只与主键直接相关而不是间接相关。(表中的每一列只能依赖于主键)
实际数据和三大范式的冲突(数据库的设计)
冲突原因:规范性和性能的问题
一般情况下关联查询的表不得超过三张表
- 考虑商业化的需求和目标。(成本,用户体验!) 数据库的性能更加重要。
- 在规范性能的问题的时候,需要适当的考虑一下 规范性!
- 故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)
- 故意增加一些计算列 (从大数据量降低为小数据量的查询: 索引)
JDBC相关
可以说是数据库万能驱动,有了这个才能操作数据库
数据库驱动
不同数据库有不同驱动,如MySQL和Oracle是不同驱动
JDBC
JDBC (Java Database Connectivity) API,即java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。比如建立数据库连接、执行SQL语句进行数据的存取操作。
即应用程序连接JDBC,JDBC去连接各个数据库的驱动执行操作
代码如下(记得往lib导入JDBC的jar包)
package jdbcTest;
import java.sql.*;
public class jdbcTest001 {
//总共可以分为六部
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1 加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");//固定写法
//2 设置参数,连接的数据库,用户名,密码
//支持中文编码 useUnicode=true 设置编码方式characterEncoding=utf8 使用安全的连接useSSL=true
String url = "jdbc:mysql://localhost:3306/testschool?useUnicode=true&characterEncoding=utf8&useSSL=true";
String userName = "xuanli";
String passWord = "xuanlichaobang";
//3 用这些参数去连接数据库
Connection connection = DriverManager.getConnection(url,userName,passWord);
//4 创建执行SQL的对象 Statement
Statement statement = connection.createStatement();
//5 写SQL并且执行获取结果
String sql = "SELECT * FROM testmd5";
//resultSet就是结果集
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println(resultSet.getObject("id"));
}
//6 关闭连接
resultSet.close();
statement.close();
connection.close();
}
}