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