数据库设计以及和项目之间的关系

发布时间 2023-08-12 01:11:40作者: 啃兔子的大萝卜

数据库设计以及和项目之间的关系(涉及JDBC)

规范数据设计

糟糕的数据库设计:

  • 数据冗余,浪费空间

  • 数据库插入和删除都会麻烦、异常[屏蔽使用物理外键)

  • 程序的性能差

良好的数据库设计:

  • 节省内存空间
  • 保证数据库的完整性
  • 方便我们开发系统

软件开发中,关于数据库的设计

  • 分析需求: 分析业务和需要处理的数据库的需求
  • 概要设计: 设计关系图 E-R 图

设计数据库的步骤(例如设计博客网站)

  1. 收集信息,分析需求(表的类型,每种表需要的信息)

    • 用户表 (用户登录注销,用户的个人信息,写博客,创建分类)
    • 分类表(文章分类,谁创建的)
    • 文章表 (文章的信息)
    • 自定义表(系统信息,某个关键的字,或者一些主字段) key : value
  2. 标识实体(落实需求字段,如设计用户表,里面有ID,name,text等对应的分别是什么)

  3. 标识实体之间的联系

    • 写博客: user-->blog (要用到用户表和文章表)
    • 创建分类: user-->category(要用到用户表和分类表)
    • 关注: user-->user(要用到用户表和用户表)
    • ..........

为什么要使用三大范式

为什么要数据规范化

为了防止以下情况

  1. 信息重复
  2. 更新异常
  3. 插入异常
    • 无法正常显示信息
  4. 删除异常
    • 丢失有效的信息

三大范式

第一范式(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();
    }

}