資料庫原理

来源:https://www.cnblogs.com/Java3y/archive/2018/03/04/8505242.html
-Advertisement-
Play Games

什麼是資料庫? 資料庫是一個以某種 有組織的方式存儲的數據集合 。也就是: 保存有組織數據的容器 (一個文件或一組文件) 為什麼我們需要資料庫? 毫無疑問,資料庫是用來存儲數據的。我們對excel肯定不會陌生,excel也是用來存儲數據。那既然有excel這樣非常好用的軟體了,為什麼需要資料庫呢?? ...


什麼是資料庫?

資料庫是一個以某種有組織的方式存儲的數據集合。也就是:保存有組織數據的容器(一個文件或一組文件)

為什麼我們需要資料庫?

毫無疑問,資料庫是用來存儲數據的。我們對excel肯定不會陌生,excel也是用來存儲數據。那既然有excel這樣非常好用的軟體了,為什麼需要資料庫呢??

  • excel存儲的數據量太少了。由於我們網路發展,excel的存儲量遠遠不能支撐我們的需求。
  • excel數據無法多人共用。excel只是一個單一的文件,只能是當前的用戶使用並修改。
  • 數據安全性。對excle數據的修改是很隨意的。

資料庫就解決了上面的問題,並且資料庫以特殊的機制管理數據文件,對數據有極高的讀寫速度,大大超過了操作系統對常規文件的讀寫速度。

資料庫系統的組成

資料庫系統由三個層次組成:

  • 資料庫(dataBase)
    • 存放數據的倉庫,按照一定的格式(有組織的方式)進行儲存
  • 資料庫管理系統(dataBase Manager System)
    • 建立、管理、維護資料庫的系統軟體
  • 資料庫應用系統(dataBase Application System)
    • 使用到資料庫技術的應用軟體

這裡寫圖片描述


數據描述與數據模型

理解數據描述

我們在現實生活中描述一個事物是非常簡單的,看到“一棵樹”,就說是“一棵樹”

但怎麼把“一棵樹“在電腦描述起來呢??電腦只識別0和1”一棵樹“是不能直接存儲到電腦上的

於是乎,我們就把”一棵樹“抽象出來,形成信息世界的概念模型。然後將概念模型的形式化成是DBMS支持的數據模型,存儲在電腦中

簡單來說:數據描述就是將現實世界中的實物抽象出來,形成概念模型。把概念模型的形式轉換成是DBMS支持的類型,然後存儲到電腦中!


理解數據模型

數據模型主要用來描述數據!上邊已經說了,當我們想在電腦上存儲現實事物的數據時,需要先抽象成概念模型。將概念模型轉換成DBMS支持的數據模型,就可以把事物存儲到電腦中!

數據模型一般由三個部分組成:

  • 數據結構(對象與對象之間的關係)
  • 數據操作(增刪改查)
  • 完整性約束(限定數據是有一定規則的,比如:年齡不能為負數)

數據模型也經歷了一個發展階段:

①:層次模型,是一種樹型(層次)結構來組織數據的數據模型。

這裡寫圖片描述

優點:

  • 結構清晰,容易理解
  • 節點之間聯繫可以通過指針來實現,查詢效率高

缺點:

  • 對於非層次結構的數據,表示起來非常麻煩,不直觀!

②:網狀模型, 是用有向圖結構來組織數據的數據模型

這裡寫圖片描述

優點:

  • 非常靈活,更能直接地描述現實世界的事物

缺點:

  • 結構複雜,非常難維護

③:關係模型,是一種用二維表格結構表示數據及數據之間聯繫的數據模型。

關係模型是我們現在用得最多的數據模型。

優點:

  • 數據結構簡單、清晰。無論實體還是實體集,都用相對應的二維表來表示!
  • 有嚴格的數學理論根據。各種關係運算(後面會講到)

缺點:

  • 查詢效率比非關係模型查,尤其是多表查詢的時候!

術語(基本概念)

我們對照著課程關係表來講解吧:

實體(Entity)

客觀存在並可相互區別的事物稱之為實體。可以看成是Java類

例子:(課程關係表)就是一個實體。


屬性(Attribute)

實體所具有的某一特性稱之為屬性。可以看成是Java類的成員變數。屬性在資料庫中又稱為欄位(或者是列)

例子:(課程名),(課程號)、(學時)就是屬性名。


元組

除含有屬性名所在的行之外的其他行稱之為元組。

下麵的每一行數據都稱之為元組
(C401001 數據結構 70)
(C401002 操作系統 80)
(C402001 電腦原理 60)


碼(Key)

碼也被稱作是關鍵字。它可以唯一標識一個實體

候選碼和主碼:

  • 候選碼:如果一組屬性集能唯一地標識一個關係中的元組而又不含有多餘的屬性,則稱該屬性集為該關係的候選碼 。(候選碼可能不止有一個
  • 主碼:用戶選定的那個候選鍵稱為主鍵

例子:郵寄地址(城市名,街道名,郵政編碼,單位名,收件人)

它有兩個候選鍵:{城市名,街道名} 和 {街道名,郵政編碼}

如果我選取{城市名,街道名}作為唯一標識實體的屬性,那麼{城市名,街道名} 就是主碼


關係模式

關係名和其屬性集合的組合稱之為關係模式

關係模式例子:課程關係表(課程號,課程名,學時)

提示:關係模型就是關係模式組成的集合


關係模型要求元組的每一個分量都是原子性的,也就是說,它必須屬於某種元素類型,如Integer、String等等,不能是列,集合,記錄,數組!

域就代表著該元組中每個分量的類型,從上面的圖我們可以看出,它的域是這樣的:課程號:string,課程名:string,學時:int


資料庫體系內部結構

資料庫的體系內部結構我們可以分為三層:

  • 外模式
  • 邏輯模式
  • 內模式

三級模式的位置:

這裡寫圖片描述

三級模式的作用:

這裡寫圖片描述

邏輯模式

邏輯模式是對資料庫全部數據的整體邏輯結構的描述

例子:現在我有一個資料庫,操作許可權、角色、用戶之間的關係

於是有了以下的關係模式

  • 許可權關係(許可權編號,許可權名稱,許可權描述)
  • 角色關係(角色編號,角色名稱,角色描述)
  • 用戶關係(用戶編號,用戶名稱,用戶密碼)

在資料庫中所有關係模式的集合就組成了邏輯模式!


外模式

外模式是對資料庫用戶能看見和使用的局部數據邏輯結構的描述,是與某一應用有關的數據的邏輯表示

外模式是可以有多個的,外模式是用戶和DBAS的介面,是對局部邏輯結構的描述!

當用戶應用程式只需要顯示用戶名稱和密碼時:

  • 用戶關係(用戶名稱,用戶密碼)

在資料庫中操作局部邏輯結構就稱作為外模式


內模式

內模式是對資料庫表物理存儲結構的描述。它定義了數據的內部記錄類型、記錄定址技術、索引和文件的組織方式及數據控制方面的內容

這裡寫圖片描述


DB內部體繫結構的兩級映像

兩級映像分別是:

  • 外模式和邏輯模式的映像
  • 邏輯模式和內模式的映像

這裡寫圖片描述

提出兩級映射的概念有什麼用呢?為什麼需要有這兩級映像呢??

  • 當資料庫的邏輯模式結構因某種原因修改時,只要沒有改變邏輯模式中與外模式定義有關的屬性及與其關係模式名的隸屬關係,就可使外模式保持不變,從而不需修改應用程式
  • 當資料庫的內模式由於某種原因要修改時,可通過對邏輯模式與內模式之間的映象的修改,使邏輯模式儘可能地保持不變,實現內模式的改變儘可能地不修改應用程式。

也就說:在改變內部結構的時候,只要不會觸及外部的數據時,外部的數據並不需要做改變。兩級映像概念的提出也就是程式中耦合的問題!


為什麼我們要學習資料庫關係運算?

學習和理解關係運算的機理,對於理解關係資料庫中的數據查詢機制有十分重要的意義。

我們可能知道多表查詢的時候要消除重覆多餘的數據,那重覆多餘的數據怎麼產生的呢??WHERE字句又是怎麼篩選數據的呢??這些問題我們在關係運算中可以找到答案的。

學習資料庫的關係運算,會讓我們明白SQL語句是怎麼執行的,是通過什麼手段讓我們得到想要的結果。


學習大綱

這裡寫圖片描述

笛卡爾積

什麼是笛卡爾積?

笛卡爾積簡單來說就是兩個集合相乘的結果

為什麼查詢資料庫會出現笛卡爾積

前面的博文已經說了,關係模型是關係模式的集合

資料庫中的兩張表就相當於兩個集合,當我們使用SELECT語句查詢數據的時候,DBMS內部就是以集合相乘的運算得出結果

笛卡爾積的產生過程

我們發現:笛卡爾積的基數是每個集合的元組相乘
這裡寫圖片描述

得出來的數據內容是難以符合現實中的實際情況的

這裡寫圖片描述

為了更好地看見效果,我都會以實際的SQL語句來看效果,然後說明問題的。

emp表的記錄有14條:

這裡寫圖片描述

dept表有4條記錄:

這裡寫圖片描述

我們來看看SMITH,在emp表中,他只在20部門。

這裡寫圖片描述

但在兩張表查詢後,10、20、30、40部門他都在了!!我們再觀察56條數據,發現每個人都有4個部門,這樣的數據是不合理的!!

這裡寫圖片描述

再回到初衷,我們查詢兩張表的目的是什麼??在查詢員工信息的同時,也能知道員工的部門名稱是什麼!!!所以,我們查詢的記錄數是不應該有56條這麼多的。。我們查詢的記錄數應該是員工表的記錄數,也就是14條而已!

我們再來分析:emp表中有deptno欄位,dept表中也有deptno欄位!而且發現,emp表中的deptno欄位的取值範圍是由dept表中deptno欄位來決定的!!!

所以,我們可以使用等值連接(emp.deptno=dept.deptno)來消除笛卡爾積,這樣就達到我們的目的了!

這裡寫圖片描述


基於傳統集合理論的關係運算

在Oracle上,操作集合的語法提供了4個關鍵字:

  • UNION(並集,重覆的元組不顯示)
  • UNION ALL(並集,重覆的元組也會顯示)
  • MINUS(差集)
  • INTERSECT(交集)

顯示查詢結果的全部信息,消除重覆的元組

這裡寫圖片描述

查詢所有辦事員和經理的信息


	SELECT *
	FROM emp
	WHERE job = 'MANAGER'
	
	UNION

	SELECT *
	FROM emp
	WHERE job = 'CLERK';

這裡寫圖片描述

註意:使用UNION並操作,比使用關鍵字OR的性能要好!


返回查詢結果相同的部分

這裡寫圖片描述

查詢10部門的信息


SELECT *
FROM dept

INTERSECT 
SELECT *
FROM dept
WHERE deptno = 10;


(全部部門和部門10只有部門10是相同的,所以最後返回的是部門10的結果)

這裡寫圖片描述


返回的查詢結果是

這裡寫圖片描述

這裡寫圖片描述


SELECT *
FROM dept

MINUS
SELECT *
FROM dept
WHERE deptno = 10;


這裡寫圖片描述


關係代數特有的關係運算

投影

投影的運算過程:

首先按照j1,j2,…,jk的順序,從關係R 中取出列序號為j1,j2,…,jk(或屬性名序列為Aj1,Aj2,…,Ajk )的k 列,然後除去結果中的重覆元組,構成一個以Aj1,Aj2,…,Ajk為屬性順序的k 目關係。

簡單來說:取出一個查詢結果中某某列,並消除重覆的數據,這就是投影!

  • 投影是從列的角度進行的運算
  • 投影的下標可是列序號,也可是列屬性名

查詢出所有部門的編號




SELECT deptno
FROM dept;

查詢時的過程:先查詢得出dept表的所有結果,再通過投影運算只提取"deptno"的列數據,如果 SELECT 後邊跟的是"*",那麼就是投影全部數據!

這裡寫圖片描述


選擇

使用比較運算符、邏輯運算符,挑出滿足條件的元組,運算出結果!

查詢出工資大於2000的員工的姓名



SELECT ename
FROM emp
WHERE sal > 2000;

過程:首先查詢出emp表的所有結果,使用選擇運算篩選得出工資大於2000的結果,最後使用投影運算得出工資大於2000員工的名字!

這裡寫圖片描述


除運算

除運算的實際應用我還沒想明白~~~如果有朋友知道除運算能夠用在資料庫的哪處,請告訴我一聲哈。。

我們也瞭解一下除運算的過程吧:關係R有ABCD,關係S有CD,首先投影出AB(因為S有CD),再用投影出來AB的結果和關係S做笛卡爾積運算。如果做的笛卡爾積運算記錄在R關係中找到相對應的記錄,那麼投影的AB就是結果了!

這裡寫圖片描述


連接運算

連接運算其實就在笛卡爾積運算的基礎上限定了條件(某列大於、小於、等於某列),只匹配和條件相符合的,從而得出結果!

自然連接

自然連接就是一種特殊的連接運算,它限定的條件是【某列等於某列】。自然連接我們經常使用到。消除笛卡爾積其實就是自然連接了!


SELECT *
FROM emp, dept
WHERE dept.deptno = emp.deptno;

設定將dept表的deptno列和emp的deptno列為相同【這就是自然連接】


如果文章有錯的地方歡迎指正,大家互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同學,可以關註微信公眾號:Java3y

更多的文章可往:文章的目錄導航
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Nginx (engine x) 是一個高性能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發佈於2004年10月4日。 其將源代碼以類BSD許 ...
  • kali的網卡配置文件為/etc/network/interfaces 下麵定義了lo、eth0和eth1的配置 然後重啟網路 或者重啟某個網卡 ...
  • 1、為什麼選擇Arch Linux Arch Linux 是通用 x86-64 GNU/Linux 發行版。Arch採用滾動升級模式,盡全力提供最新的穩定版軟體。初始安裝的Arch只是一個基本系統,隨後用戶可以根據自己的喜好安裝需要的軟體並配置成符合自己理想的系統。 —— 引自Arch Linux ...
  • Linux中查看jdk安裝目錄、Linux卸載jdk、rpm命令、rm命令參數 ...
  • 1、首先檢查LAMP環境 2、配置博客軟體(wordpress) 上述mv的原因是cp出錯,查看錯誤日誌 缺少文件,所以cp無法全部拷貝,使用mv 輸入120.25.255.87,進入wordpress設置 3、配置資料庫 因為博客的安裝需要用到資料庫 許可權不夠,因為把httpd.conf用戶改為了 ...
  • 資料庫常見面試題(開發者篇) 什麼是存儲過程?有哪些優缺點? 什麼是存儲過程?有哪些優缺點? 存儲過程就像我們編程語言中的函數一樣,封裝了我們的代碼(PLSQL、T SQL) 。 存儲過程的優點: 能夠將代碼封裝起來 保存在資料庫之中 讓編程語言進行調用 存儲過程是一個預編譯的代碼塊,執行效率比較高 ...
  • mysql資料庫的安裝與配置 workbench的簡單使用 ...
  • MySQL的複製解決什麼樣的問題,MySQL的二進位日誌的格式對數據的影響,如何實現主從複製,MySQL的複製拓撲圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...