规范数据库设计
為什么需要設計數據庫:
當數據庫比較復雜的時候,我們 需要設計了
糟糕的數據庫設計:
(1)數據冗余,浪費空間
(2)數據庫插入和刪除都會麻煩、異常【屏蔽使用物理外鍵】? ? ? ??
(3)程序的性能差
良好的數據庫設計:
(1)節省內存空間
(2)保證數據庫的完整性
(3)方便我們開發系統
軟件開發中,關于數據庫的設計:
(1)分析需求:分析業務和需要處理的數據庫的需求
(2)概要設計:設計關系圖E-R圖
設計數據庫的步驟:(個人博客)
1、收集信息,分析需求
? ? ? ? (1)用戶表(用戶登錄注銷,用戶的個人信息,寫博客,創建分類)
? ? ? ? (2)分類表(文章分類,誰創建的)
? ? ? ? (3)文章表(文章的信息)
????????(4)評論表
? ? ? ? (5)友鏈表(友鏈信息)
????????(6)自定義表(系統信息,某個關鍵的字,或者一些主字段)? key:value
????????(7)說說表(發表心情...id...content....create_time)
2、標識實體(把需求落地到每個字段)
3、標識實體之間的關系
????????(1)寫博客:user-->blog
? ? ? ? (2)創建分類:user-->cateblog
? ? ? ? (3)關注:user-->user
? ? ? ? (4)友鏈:links
? ? ? ? (5)評論:user-user-blog
三大范式:
為什么需要數據規范化?
(1)信息重復
(2)更新異常
(3)插入異常
? ? ? ? *無法正常顯示信息
(4)刪除異常
? ? ? ? *丟失有效的信息
三大范式:
第一范式(1NF):
要求數據庫表的每一列都是不可分割的原子數據項。
????????原子性:保證每一列不可再分
第二范式(2NF):
前提:滿足第一范式
每張表只描述一件事情
第三范式(3NF):
前提:滿足第一范式和第二范式
第三范式需要確保數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
(規范數據庫的設計)
規范性和性能的問題
關聯查詢的表不得超過三張表
? ? ? ? (1)考慮商業化的需求和目標,(成本,用戶體驗!)數據庫的性能更加重要
? ? ? ? (2)在規范性能的問題的時候,需要適當的考慮一下規范性!
? ? ? ? (3)故意給某些表增加一些冗余的字段。(從多表查詢變為單表查詢)
? ? ? ? (4)故意增加一些計算列(從大數據量降低為小數據量的查詢:索引)
JDBC(重點):
數據庫驅動:
驅動:聲卡、顯卡、數據庫
我們的程序會通過數據庫驅動,和數據庫打交道!
JDBC:
SUN公司為了簡化開發人員的(對數據庫的統一)操作,提供了一個(Java操作數據庫的)規范,俗稱JDBC。
這些規范的實現由具體的廠商去做~
對于開發人員來說,我們只需要掌握JDBC操作即可!
java.sql
javax.sql
還需要導入一個數據庫驅動包。mysql-connector-java-5.1.25-bin.jar?
第一個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,'zhansan' ,'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');1、創建一個數據庫
2、導入數據庫驅動
3、編寫測試代碼
package com.yang.lesson01;import java.sql.*;//我的第一個JDBC程序 public class JdbcFirstDemo {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.加載驅動Class.forName("com.mysql.cj.jdbc.Driver");//固定寫法,加載驅動//2.用戶信息和url//useUnicode=true&characterEncoding=utf8&useSSL=trueString url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";String username = "root";String password = "root";//3.連接成功,數據庫對象 Connection 代表數據庫Connection connection = null;try{connection = DriverManager.getConnection(url, username, password);}catch (Exception e){System.out.println("dasdas");}//4.執行SQL的對象 Statement 執行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("birth=" + resultSet.getObject("birthday"));}//6.釋放連接resultSet.close();statement.close();connection.close();} }步驟總結:
1、加載驅動
2、連接數據庫DriverManager
3、獲得執行sql的對象 Statement
4、獲得返回的結果集
5、釋放連接
DriverManager
//DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.cj.jdbc.Driver");//固定寫法,加載驅動connection connection = DriverManager.getconnection(ur1,username,password);//connection 代表數據庫 //數據庫設置自動提交 //事務提交 //事務回滾connection。rollback(); connection.commit();connection.setAutoCommit();URL
String url = "jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";//mysql--3306//jdbc:mysql://主機地址:端口號/數據庫名?參數1&參數2&參數3//oralce--1521//jdbc:oracle:thin:@localhost:1521:sidStatement:執行SQL的對象? ? ? ? PrepareStatement執行SQL的對象
String sql = "SELECT * FROM users";//編寫SQLstatement.executeQuery();//查詢操作返回ResultSet statement.execute();//執行任何SQL statement.executeUpdate();//更新、插入、刪除。都是用這個,返回一個受影響的行數ResultSet 查詢的結果集:封裝了所有的查詢結果
獲得指定的數據類型
resultSet.getObject();//在不知道列類型的情況下使用 resultSet.getString();//如果知道列的類型就使用指定的類型 resultSet.getInt(); resultSet.getFloat(); resultSet.getDate(); resultSet.getObject(); ......遍歷,指針
resultSet.beforeFirst();//移動到最前面resultSet.afterLast();//移動到最后面resultSet.next();//移動到下一個數據resultSet.previous();//移動到前一行resultSet.absolute();//移動到指定行釋放資源
//6.釋放連接resultSet.close();statement.close();connection.close();//耗資源,用完關掉!總結
- 上一篇: 问题 L: 鸭子唱歌
- 下一篇: MySQL 规范数据库设计