資料庫系統概念筆記-關係模型介紹

来源:http://www.cnblogs.com/cyninma/archive/2016/05/25/5522141.html
-Advertisement-
Play Games

2.1 關係資料庫的結構 關係資料庫由表(table)的集合構成,每個表有唯一的名字。例如,instructor表記錄了有關教師的信息,它有四個列首:ID、name、dept_name和salary。該表中每一行記錄了一位教師的信息,包括該教師的ID、name、dept_name以及salary。類 ...


2.1 關係資料庫的結構

 關係資料庫由表(table)的集合構成,每個表有唯一的名字。例如,instructor表記錄了有關教師的信息,它有四個列首:ID、name、dept_name和salary。該表中每一行記錄了一位教師的信息,包括該教師的ID、name、dept_name以及salary。類似的,course表存放了關於課程的信息,包括每門課程的course_id、title、dept_name和credits。註意,每位教師通過ID列的取值進行標識,而每門課程則通過course_id列的取值來標識。

 第三個表是prereq,它存放了每門課程的先修課程信息。該表具有course_id和prereq_id兩列,每一行由一個課程對組成,這個課程對錶示了第二門課程是第一門課程的先修課。

 由此,prereq表中的每行標識了兩門課程之間的聯繫:其中一門課程是另一門課程的先修課。作為另一個例子,我們考察instructor表,表中的行可被認為是代表了從一個特定的ID到相應的name、dept_name和salary值之間的聯繫。

 一般來說,表中一行代表了一組值之間的一種聯繫。由於一個表就是這種聯繫的一個集合,表這個概念和教學上的關係這個概念是密切相關的,這也正是關係數據模型名稱的由來。在數學術語中,元組(tuple)只是一組值的序列(或列表)。在n個值之間的一種聯繫可以在數學上用關於這些值的一個n元組(n-tuple)來表示,換言之,n元組就是一個有n個值的元組,它對應於表中的一行。

instructor關係
ID name dept_name salary
10101 Srinivasan Comp. Sci. 65000
12121 Wu Finance 90000
15151 Mozart Music 40000
22222 Einstein Physics 95000
32343 El Said History 60000
33456 Gold Physics 87000
45565 Katz Comp. Sci. 75000
58583 Califieri History 62000
76543 Singh Finance 80000
76766 Crick Biology 72000
83821 Brandt Comp. Sci. 92000
98345 Kim Elec. Eng. 80000
 
course關係
course_id title dept_name credits
BIO-101 Intro. to Biology Biology 4
BIO-301 Genetics Biology 4
BIO-399 Compultational Biology Biology 3
CS-101 Intro. to Computer Science Comp. Sci. 4
CS-190 Game Design Comp. Sci. 4
CS-315 Robotics Comp. Sci. 3
CS-319 Image Processing Comp. Sci. 3
CS-347 Database System Concepts Comp. Sci. 3
EE-181 Intro. to Digital Systems Elec. Eng. 3
FIN-201 Investment Banking Finance 3
HIS-351 World History History 3
MU-199 Music Video Production Music 3
PHY-101 Physical Principles Physics 4
 
prereq關係
course_id prereq_id
BIO-301 BIO-101
BIO-399 BIO-101
CS-190 CS-101
CS-315 CS-101
CS-319 CS-101
CS-347 CS-101
EE-181 PHY-101

 

 

 

 

 

 

 

 

 

 

 

 

 這樣,在關係模型的術語中,關係相當於表,而元組相當於行,類似的,屬性相當於列。可見instructor關係有四個屬性:ID、name、dept_name和salary。

 我們用關係實例這個術語來表示一個關係的特定實例,也就是所包含的一組特定的行。可見instructor的實例有12個元組,對應於12個教師。

 由於關係是元組集合,所以元組在關係中出現的順序是無關緊要的,也就是說,無論怎麼排序,它們都是同樣的元組集合。

 對於關係的每個屬性,都存在一個允許取值的集合,稱為該屬性的域。這樣instructor關係的salary屬性的域就是所有可能的工資值的集合,而name屬性的域是所有可能的教師名字的集合。

 我們要求對所有關係 r 而言,r 的所有屬性的域都是原子的。如果域中元素被看作是不可再分的單元,則域是原子的。例如,假設instructor表有一個屬性phone_number,它存放教師的一組電話號碼,那麼phone_number就不是原子的,因為一組電話號碼還可以細分出單個電話號碼。

 空(null)值是一個特殊的值,標識值未知或不存在。如果某個教師沒有電話號碼,或者不提供,那麼我們只能使用空值來強調該值未知或不存在。

2.2 資料庫模式

 談論資料庫時,我們必須區分資料庫模式資料庫實例,前者是資料庫的邏輯設計,後者是給定時刻資料庫中數據的一個快照。

 關係的概念對應於程式設計語言中變數的概念,而關係模式的概念對應於程式設計語言中類型定義的概念。關係實例的概念對應於程式設計語言中變數的值的概念。給定變數的值可能隨事件發生變化;類似的,當關係被更新時,關係實例的內容也隨事件發生了變化。相反,關係的模式是不常變化的。

 儘管知道關係模式和關係實例的區別非常重要,我們常常使用同一個名字,比如instructor,既指代模式,也指代實例。在需要的時候,我們會顯式地指明模式或實例。例如“instructor模式”或“instructor關係的一個實例”。然而,在模式或實例的含義清楚的情況下,我們就簡單的使用關係的名字。

 考察department關係,該關係的模式是:

department(dept_name, building, budget)

department關係
dept_name building budget
Biology Watson 90000
Comp. Sci. Taylor 100000
Elec. Eng. Taylor 85000
Finance Painter 120000
History Painter 50000
Music Packard 80000
Physics Watson 70000

 

 

 

 

 

 

 

 

 請註意屬性dept_name既出現在instructor模式中,又出現在department模式中。這樣的重覆並非一種巧合。實際上,在關係模式中使用相同屬性正是將不同關係的元組聯繫起來的一種方法。例如,假設我們希望找出Watson大樓工作的所有教師的相關信息。我們首先在department關係中找出所有位於Watson的系的dept_name。接著,對每一個這樣的系,我們在instructor關係中找出與dept_name對應的教師信息。

2.3 碼(主碼-外碼)

 我們必須有一種能區分給定關係中不同元組的方法。這用它們的屬性來表明。也就是說,一個元組的屬性值必須是能夠唯一區分元組的

 超碼(superkey)是一個或多個屬性的集合,它可以唯一地標識一個元組。例如,ID是instructor的一個超碼,它可以唯一地標識instructor的一個元組。

 超碼中可能包含無關緊要的屬性。例如,ID和name的組合是instructor的一個超碼,但是name是無關緊要的,倒是它的真子集ID也是一個超碼,而且ID集合的任意真子集都不再是instructor的超碼了。我們通常值對這樣的一些超碼感興趣,他們的任何真子集都不能稱為超碼,這樣的最小超碼就被稱為候選碼

 我們用主碼這個術語來代表被資料庫設計者選中的、主要用來在一個關係中區分不同元組的候選碼。碼是整個關係的一種性質,而不是單個元組的性質。關係中的任意兩個不同的元組都不允許同時在碼屬性上具有相同的值。

 一個關係模式(如r1)可能在它的屬性中包括另一個關係模式(如r2)的主碼。這個屬性在r1上稱作參照r2外碼。關係r1也稱為外碼依賴的參照關係r2叫做外碼的被參照關係。例如,instructor中的dept_name屬性在instructor上是外碼,它參照department,因為dept_name是department的主碼。

 現在考察section和teaches關係。如下需求是合理的:如果一門課程是分段授課的,那麼它必須至少由一位教師來講授;當然它可能由不止一位教師來講授。為了施加這種約束,我們需要保證如果一個特定的(course_id, sec_id, semester, year)組合出現在section中,那麼該組合也必須出現在teaches中。可是,這組值並不構成teaches的主碼,因為不止一位教師可能講授同一個這樣的課程段。其結果是,我們不能聲明從section到teaches的外碼約束。從section到teaches的約束是參照完整性約束

2.4 模式圖

 一個含有主碼和外碼依賴的資料庫模式可以用模式圖來標識。下圖展示了我們大學組織的模式圖。每一個關係用一個矩形來標識,關係的名字顯示在矩形上方,矩形內列出各屬性。主碼屬性用下劃線標註。外碼依賴用從參照關係的外碼屬性到被參照關係的主碼屬性之間的箭頭來標識。

2.5 關係查詢語言

查詢語言是用戶從資料庫中請求獲取信息的語言。這些語言通常比標準的程式設計語言層次更高。查詢語言可以分為過程化的和非過程化的。在過程化語言中,用戶知道系統對資料庫執行一些列操作以計算出所需的結果。在非過程化語言中,用戶只需描述所需信息,而不用給出獲取信息的具體過程。

2.6 關係運算

 所有的過程化關係查詢語言都提供了一組運算,這些運算要麼施加於單個關係上,要麼施加於一對關係上。這些運算具有一個很好的,並且也是所需的性質:運算結果總是單個關係。這個性質使得人們可以用模塊化的方式來組合幾種這樣的運算。特別是,由於關係查詢的結果本身也是關係,所以關係運算可施加到查詢結果上,正如施加到給定關係集上一樣。

 過濾元組:最常用的關係運算是從單個關係(如instructor)中選出滿足一些特定謂詞(如salary>85 000美元)的特殊元組,其結果是一個新的關係,它是原始關係(instructor)的一個子集,而不滿足謂詞的元組就被過濾掉了。

 選擇屬性:另一個常用的運算是從一個關係中選出特定的屬性(列)。其結果是一個只包含哪些被選中屬性的新的關係。例如,假設我們只要查出instructor關係的ID和工資,那麼教師的名字和系的名字都不會被查出來。

 連接運算可以通過下述方式來結合兩個關係:把分別來自兩個關係的元組對合併成單個元組。有好幾種不同的方式來對關係進行連接。例如,在查出教師信息的同時,也查詢出教師所在系的信息,這樣就把instructor和department連接在一起了。笛卡爾積運算倒是不同了,它的運算結果是包含來自兩個關係元組的所有對,無論它們的屬性值是否匹配,比如一個關係總共有3個元組,另一個關係總共有5個元組,笛卡爾積運算後共有15個元組。

 並運算適合在兩個“相似結構”的表上執行,比如一個訂單表和歷史訂單表,我們要查詢出過去和現在所有的訂單,那麼我們就可以將這兩張表並起來。

 關係運算的對象不僅僅是已建立的表,還可以是元算的結果。例如,如果我們向找出工資超過85 000美元的教師的ID和salary,我們可以先從instructor關係中選出salary值大於85 000美元的元組,然後從結果中選出ID和salary兩個屬性。

 去重:有時候查詢結果包含了重覆的元組,我們要去掉重覆的,例如我們只想找出instructor關係所有的教師的名字,因為教師中可能會有相同的姓名,那麼我們可以在查詢的同時把重覆的名字去掉。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接 ...
  • PL/SQL提供了豐富的流控制語句,用來對程式的執行流程進行控制。 通過流控制語句,我們可以編寫更複雜的PL/SQL塊。 流控制語句分為兩類,即條件判斷語句和迴圈語句。 IF語句 IF語句是一種條件判斷語句,它根據條件判斷的結果執行不同的代碼。 最簡單的IF語句格式為: IF 條件 THEN 代碼 ...
  • 手機微博4040埠SQL優化 現象 某埠常態化延遲,通過使用pt-query-digest發現主要由於一條count(*)語句引發,具體如下: 我們來查看一下這個表的表結構和這條語句的explain結果,看是否可以優化,具體如下: 可以看到通過type和extra都可以發現其實是用到了index ...
  • 最近在mysql主從複製中用到鎖,翻了資料回憶一下。一下內容參考於:http://blog.csdn.net/arkblue/article/details/27376991 1.FLUSH TABLES WITH READ LOCK 這個命令是全局讀鎖定,執行了命令之後所有庫所有表都被鎖定只讀。一 ...
  • --Student(S#,Sname,Sage,Ssex) 學生表 --Course(C#,Cname,T#) 課程表 --SC(S#,C#,score) 成績表 --Teacher(T#,Tname) 教師表 --問題: --1、查詢""課程比""課程成績高的所有學生的學號; select a.S... ...
  • nvarchar(max)長度測試:在使用convert強制類型轉化之後 文本長度可以突破8000的上限。並且nvarchar(max)的最大長度可達到2^31以下為驗證SQL: 不過在表中max的長度就不會那麼長了,一般限制就是4000/8000,具體數值估計是要依賴於SQLServer版本了。以 ...
  • 事務(Transaction):組織多個操作為一個整體,要麼全部執行,要麼全部不執行 “回滾” ,rollback SQL介面:sql語句分析器和優化器 表:為了滿足範式設計要求,將一個數據集分拆為多個 約束:constraint,向數據表插入的數據要遵守的限制規則 主鍵:一個或多個欄位的組合,填入 ...
  • 一、JDK安裝 1、通過xftp工具把jdk-8u60-linux-x64.gz上傳到linux 2、解壓JDK命令tar -xzf jdk-8u60-linux-x64.gz 3、linux配置環境變數vi /etc/profile JAVA_HOME=/usr/local/java/jdk1.8 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...