更新時間:2022-12-28 11:22:52 來源:動力節點 瀏覽1411次
1.三個范式是什么
第一范式(1NF):數據庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構成,包括整型、實數、字符型、邏輯型、日期型等。 第二范式(2NF):數據庫表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴(部分函數依賴指的是存在組合關鍵字中的某些字段決定非關鍵字段的情況),也即所有非關鍵字段都完全依賴于任意一組候選關鍵字。
第三范式(3NF):在第二范式的基礎上,數據表中如果不存在非關鍵字段對任一候選關鍵字段的傳遞函數依賴則符合第三范式。所謂傳遞函數依賴,指的是如果存在"A → B → C"的決定關系,則C傳遞函數依賴于A。因此,滿足第三范式的數據庫表應該不存在如下依賴關系: 關鍵字段 → 非關鍵字段x → 非關鍵字段y
上面的文字我們肯定是看不懂的,也不愿意看下去的。接下來我就總結一下:
首先要明確的是:滿足著第三范式,那么就一定滿足第二范式、滿足著第二范式就一定滿足第一范式
第一范式:字段是最小的的單元不可再分 學生信息組成學生信息表,有年齡、性別、學號等信息組成。這些字段都不可再分,所以它是滿足第一范式的
第二范式:滿足第一范式,表中的字段必須完全依賴于全部主鍵而非部分主鍵。 其他字段組成的這行記錄和主鍵表示的是同一個東西,而主鍵是唯一的,它們只需要依賴于主鍵,也就成了唯一的 學號為1024的同學,姓名為Java3y,年齡是22歲。姓名和年齡字段都依賴著學號主鍵。
第三范式:滿足第二范式,非主鍵外的所有字段必須互不依賴 就是數據只在一個地方存儲,不重復出現在多張表中,可以認為就是消除傳遞依賴 比如,我們大學分了很多系(中文系、英語系、計算機系……),這個系別管理表信息有以下字段組成:系編號,系主任,系簡介,系架構。那我們能不能在學生信息表添加系編號,系主任,系簡介,系架構字段呢?不行的,因為這樣就冗余了,非主鍵外的字段形成了依賴關系(依賴到學生信息表了)!正確的做法是:學生表就只能增加一個系編號字段。
2.什么是視圖?以及視圖的使用場景有哪些?
視圖是一種基于數據表的一種虛表
(1)視圖是一種虛表
(2)視圖建立在已有表的基礎上, 視圖賴以建立的這些表稱為基表
(3)向視圖提供數據內容的語句為 SELECT 語句,可以將視圖理解為存儲起來的 SELECT 語句
(4)視圖向用戶提供基表數據的另一種表現形式
(5)視圖沒有存儲真正的數據,真正的數據還是存儲在基表中
(6)程序員雖然操作的是視圖,但最終視圖還會轉成操作基表
(7)一個基表可以有0個或多個視圖
有的時候,我們可能只關系一張數據表中的某些字段,而另外的一些人只關系同一張數據表的某些字段...
那么把全部的字段都都顯示給他們看,這是不合理的。
我們應該做到:他們想看到什么樣的數據,我們就給他們什么樣的數據...一方面就能夠讓他們只關注自己的數據,另一方面,我們也保證數據表一些保密的數據不會泄露出來...
我們在查詢數據的時候,常常需要編寫非常長的SQL語句,幾乎每次都要寫很長很長....上面已經說了,視圖就是基于查詢的一種虛表,也就是說,視圖可以將查詢出來的數據進行封裝。。。那么我們在使用的時候就會變得非常方便...
值得注意的是:使用視圖可以讓我們專注與邏輯,但不提高查詢效率
3.索引是什么?有什么作用以及優缺點?
什么是索引【Index】
(1)是一種快速查詢表中內容的機制,類似于新華字典的目錄
(2)運用在表中某個些字段上,但存儲時,獨立于表之外
索引表把數據變成是有序的....
快速定位到硬盤中的數據文件...
4.什么是事務?
事務簡單來說:一個Session中所進行所有的操作,要么同時成功,要么同時失敗
ACID — 數據庫事務正確執行的四個基本要素
包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。
一個支持事務(Transaction)中的數據庫系統,必需要具有這四種特性,否則在事務過程(Transaction processing)當中無法保證數據的正確性,交易過程極可能達不到交易。
舉個例子:A向B轉賬,轉賬這個流程中如果出現問題,事務可以讓數據恢復成原來一樣【A賬戶的錢沒變,B賬戶的錢也沒變】。
事例說明:
/*
* 我們來模擬A向B賬號轉賬的場景
* A和B賬戶都有1000塊,現在我讓A賬戶向B賬號轉500塊錢
*
* */
//JDBC默認的情況下是關閉事務的,下面我們看看關閉事務去操作轉賬操作有什么問題
//A賬戶減去500塊
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();
//B賬戶多了500塊
String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
從上面看,我們的確可以發現A向B轉賬,成功了。可是**如果A向B轉賬的過程中出現了問題呢?**下面模擬一下
//A賬戶減去500塊
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();
//這里模擬出現問題
int a = 3 / 0;
String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
顯然,上面代碼是會拋出異常的,我們再來查詢一下數據。A賬戶少了500塊錢,B賬戶的錢沒有增加。這明顯是不合理的。
我們可以通過事務來解決上面出現的問題
//開啟事務,對數據的操作就不會立即生效。
connection.setAutoCommit(false);
//A賬戶減去500塊
String sql = "UPDATE a SET money=money-500 ";
preparedStatement = connection.prepareStatement(sql);
preparedStatement.executeUpdate();
//在轉賬過程中出現問題
int a = 3 / 0;
//B賬戶多500塊
String sql2 = "UPDATE b SET money=money+500";
preparedStatement = connection.prepareStatement(sql2);
preparedStatement.executeUpdate();
//如果程序能執行到這里,沒有拋出異常,我們就提交數據
connection.commit();
//關閉事務【自動提交】
connection.setAutoCommit(true);
} catch (SQLException e) {
try {
//如果出現了異常,就會進到這里來,我們就把事務回滾【將數據變成原來那樣】
connection.rollback();
//關閉事務【自動提交】
connection.setAutoCommit(true);
} catch (SQLException e1) {
e1.printStackTrace();
}
上面的程序也一樣拋出了異常,A賬戶錢沒有減少,B賬戶的錢也沒有增加。
注意:當Connection遇到一個未處理的SQLException時,系統會非正常退出,事務也會自動回滾,但如果程序捕獲到了異常,是需要在catch中顯式回滾事務的。
以上就是“參與開發面試的同學,數據庫開發面試題必看”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習