【動畫解釋】關系數據庫de關系代數小記


本文章在 Github 撰寫,同時在 我的博客 進行了發布。

最近學數據庫概論學到了關系數據庫的關系代數了。哎嘛,真的把我整暈了,尤其是關系代數的使用,很容易讓人被蒙在鼓里。

letmeunderstand-2021-10-06

對我來說槽點最大的莫過於書上的例子不多了,本來就挺抽象的一種查詢語言,加上沒有足夠多讓我懂的例子(不過我本來也比較遲鈍了),真的是難上加難...
但沒辦法啊,這是我需要跨過的一道坎,於是我決定慢慢寫出這篇小記(主要針對數據庫關系代數)。不求挖的多深,但求能理解地透徹點😂
目標是...希望這篇文章對大家有所幫助吧!廢話不多說,開整! o( ̄ヘ ̄o#)

  • 注意,因采用了動圖(WebP)直觀表達,流量用戶請慎重瀏覽~

  • 關系代數是一種查詢語言。

0x00 關系代數演示工具

仍在開發中,稍后會在這里放出在線網站鏈接~

你可以強勢圍觀,這是一個開源的項目:https://github.com/SomeBottle/RA

咱有時間就會寫寫,不會咕咕咕噠! (。﹏。*)

0x01 小概念

展開閱讀:行與列 , 目&度&元數 , 屬性&字段 , 元組&基數&分量 , 域
  • 行與列

    rowandcolumn-2021-10-06

  • & & 元數

    meshanddegree-2021-10-06

    1.如果使用關系表進行展示的話,屬性數(字段數)其實就是列數,而進一步我們將屬性數稱為元數或者或者

    2.這樣看來其實元數就是目,目也就是度

  • 屬性 & 字段

    1.屬性就是字段(至少在數據庫關系表這里是這樣),都表示的是

    2.上面和下面的圖中第一行 學號,姓名,性別... 等等是 屬性名(字段名)

  • 元組 & 基數 & 分量

    tupleandcardinalityandcomponent-2021-10-06

    1.表中的一行,是一條記錄,也是一個元組,有n個元素的元組可以被稱為n元組

    2.記錄(元組)的數稱為基數,一定一定注意辨別這里的基數和下面域的基數

    3.分量是元組中一個屬性對應的值

  • domain-2021-10-06

    1.就是屬性的取值范圍所在

    2.域是一個 集合 ,域這個集合里的值都是統一數據類型的

    3.域也有一個域的基數域的基數代表域能取的值的數量,比如: 年齡屬性的域={17,18,19,20,21,22,23,24,25},那么這個域的基數就是9

    rememberfirst-2021-10-07

0x02 傳統的集合運算

展開閱讀:並/差/交的前提 , 並 , 差 , 交 , 廣義笛卡爾積

傳統的集合運算是從 的角度來進行的,也就是說操作對象集中在元組上~(๑•̀ㅂ•́)و✧

  • 並,差,交的前提

    union1-2021-10-06

    1.運算要求兩個關系具有相同的目(度,元數,屬性數,列數)
    2.運算要求兩個關系相應屬性取自同一個域,通俗來說,就是兩個關系對應的屬性是相同的

  • union2-2021-10-06

    因為是集合運算,並運算過程中一定要記得元組去重

    返回的結果是 n目(屬性數) 關系,由屬於R或者屬於S元組組成

  • except1-2021-10-06

    R-S 返回的結果是 n目(屬性數) 關系,由屬於R不屬於S元組組成

    一個例子可能有點模糊,接下來我們再來個 S-R 的例子:

    except2-2021-10-07

  • intersection-2021-10-07

    R∩S返回的結果是 n目(屬性數) 關系,由屬於R屬於S元組組成

    很容易能發現:R ∩ S = R - (R-S)

  • 廣義笛卡爾積

    bigiscoming-2021-10-07

    咱實話實說,關系代數這一部分第一個讓我暈頭的地方就是這個笛卡爾積o(≧口≦)o,接下來我盡力搞懂並用動圖展示出來笛卡爾積到底做了什么。

    為什么這里是 廣義笛卡爾積 呢?我們先看 笛卡爾積 算了什么:

    笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X×Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員

    摘自某百科

    這個概念看得我腦袋嗡嗡的,什么叫 “第二個對象是Y的所有可能有序對的其中一個成員” ?結合例子琢磨了一會兒,我結合離散數學教材關於笛卡爾積的定義梳理了一下:

    笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積,又稱直積,表示為X×Y。X中的元素作為第一個元素,Y中的元素作為第二個元素,構成有序對。而笛卡爾積就是所有這樣的有序對構成的一個集合。

    接下來我們回到這里, 其實就是一個 集合,結合上文,笛卡爾積是在域上面的一種<集合>運算 ,下面放個簡單的例子:

    cartesian1-2021-10-08

    復習一下,一個 允許的 不同取值的個數 稱為這個 域的基數。換種說法,也是一個 集合 中的 元素個數

    在上圖的示例中,TEACHER域里有 張前程,趙向前 兩位老師,這個域的基數也就是2;而MAJOR域里有 計算機專業,信息專業 兩個專業,這個域的基數也是2。最后算出的域中有四個有序對,結果這個域的基數是4.

    域的基數為m和n 的兩個域進行笛卡爾積后我們得到的 域的基數 就是 m×n (這里×是乘號的意思哈,不要多想! ( ̄△ ̄;))

    waitaminute-2021-10-08

    仔細看一下能發現上面的例子中有個 有序對 的概念,不用怕,在關系這里我們后面就用不着它了!看看接下來這個例子:

    cartesian2-2021-10-09

    到底其實我們算出了一個包含 老師所帶專業課程的所有可能性 的集合(域),把每一項元素放進關系中,這不就是元組嘛!


    guangyi-2021-10-09

    現在再說回 廣義笛卡爾積 ,為什么“廣義”呢?因為它面向的是關系,通過 操作元組 進行運算。接下來我們快速上一個例子:

    generalizedcartesian1-2021-10-10

    兩個分別為 n目m目 的關系R和S的廣義笛卡爾積是一個 (n+m)列(目) 的元組的集合(新關系)。元組的 前n列關系R 的一個元組,后m列關系S 的一個元組。若R有k1個元組,S有k2個元組,則關系R和關系S的廣義笛卡爾積有 k1 × k2 個元組。

    進行廣義笛卡爾積時對兩個關系的要求是比較寬松的:

    1. 不要求 兩個關系的 目(度,元數,屬性數,列數) 相同。

    2. 有了上面這條,其實也應該知道了,廣義笛卡爾積也 不要求 相應屬性取自同一個域。

    在這之后我們再來個詳細點的例子,把兩張不同的表進行笛卡爾積:

    generalizedcartesian2-2021-10-10


    總結

    1. 在數據庫關系里,笛卡爾積 是面向 域(集合) ,操作元素來進行計算的;而 廣義笛卡爾積 是面向 關系 ,操作元組來進行計算的。

    2. 隨便兩個關系 都可以進行廣義笛卡爾積運算(在保證 結果的關系 有意義的情況下)

      doIlearnitbefore-2021-10-10

至此,傳統的集合運算這部分我們就過完了。你,學會了嗎?喝杯茶休息一下,准備進入下一節吧!

0x03 專門的關系運算

展開閱讀:基本運算符,選擇,投影,除,連接必需的一步,θ連接,等值連接,自然連接,外連接

專門的關系運算中就不僅涉及到 行(元組) 的運算了,還會牽扯到 ,由此會更加復雜。

我自己可能也有理解錯誤的地方,但我會盡力依據現有資料去呈現這些知識點。Sit back and relax,我們准備開始接下來的旅途!

v2-e8e7460c27f012d93794ca8b62ba727b_720w-2021-10-10

  • 基本運算符

    運算符 含義
    比較運算符 大於
    大於等於
    小於
    小於等於
    = 等於
    <> 不等於
    邏輯運算符
    與(且)

    基本運算符在后面的 條件/邏輯表達式 中經常用到。∧和∨這兩個符號我覺得是最容易搞混的,着重記憶 (* ̄3 ̄)╭

  • 選擇

    選擇是對 行(元組) 進行操作的運算。

    例子:屬性名 = 常量

    selection1.1-2021-10-10

    例子:屬性名 θ 屬性名

    selection2-2021-10-10

    • 選擇語句形如 σF(關系) ,其中F邏輯表達式 。當遇到讓邏輯表達式為 元組 時,該語句會將其選擇出來。

    • 邏輯表達式形如 A θ B ,也就是 將A表達式和B表達式進行比較θ 是比較運算符。舉幾個例子:StudentAge > 17 , 17 < StudentAge , CourseNum ≥ StudentNum , StudentName = 'Jerry'

    • 上面的例子中StudentAge , StudentName一類是屬性名,而17 , 'Jerry' 一類則是常量。

    • 字符串常量 請一定記得用 單引號 括起來。

    • 所以A和B表達式可以是 屬性名 , 常量 , 書上還補充說可以是 簡單函數 ,不過在基礎應用中不太能見得到。

    • 多個 邏輯表達式可以用 邏輯運算符 進行連接,舉幾個例子:AθB ∧ CθD , AθB ∨ CθD , ┐(AθB)

    大體來說,選擇 選的是關系中符合條件的 元組 ,得到的結果是 元組集合(也算一個關系)

  • 投影

    投影可以說是四種專門關系運算中最簡單的一種了,我們可以簡單走一遍~

    投影是對 和少部分 進行操作的一種運算,我們先直接上例子:

    projection-2021-10-11

    • 投影語句形如 ΠA(關系) 其中 A 是屬性名。

    • 投影選出了 特定屬性名 對應的

    • 投影選擇出 一列或多列 屬性列后,需要 去除重復元組 , 這也是為什么說投影涉及少部分行上的操作。

  • 除運算是同時從 的方向進行運算的。

    這里的除運算理解起來可能有點“繞”,尤其是書上還引用了一個 “象集” 的概念來定義除法。那好吧 o(* ̄3 ̄)o,我們先看看 象集做了啥子

    象集這個概念以我的水平實在是難以用文字表達清楚,這里就先上直觀示例了:

    imageset1-2021-10-11

    imageset2-2021-10-12

    上面的例子R(X,Z)中X指代了 單個屬性列B ,接下來我們來幾張靜態圖展示一下 X代表一個屬性組的情況 (其實是這里懶得做動圖了_(´ཀ`」 ∠)_)

    【展開查看例子】X代表包含B,C屬性列的屬性組

    imageset3-2021-10-12

    imageset3-2-2021-10-12

    imageset3-3-2021-10-12

    imageset3-4-2021-10-12

    imageset3-5-2021-10-12

    imageset3-6-2021-10-12

    imageset3-7-2021-10-12

    (๑•̀ㅂ•́)و✧

    經過上面的例子,大家應該對 象集做了什么 大概有了個了解,這里做個總結:

    1. 我們把目標 關系 表示為 R(X,Z),其中X和Z 可以代表單個屬性列 ,亦可以代表 多個屬性列組成的屬性組

    2. X和Z是互補的,如果X 代表其中一部分屬性列 ,那么Z 一定會代表剩余的屬性列

    3. 象集做的事無非是 一次選擇一次投影 。比如我想找R關系中 x的象集,那么先選擇的是 X的分量 等於 x 的元組(可能有多個,組成集合) ,然后將這些元組(集)在 Z屬性組 上進行投影,得到x的象集。

    4. 象集的英文是ImageSet,沒錯,它也是 集合 !如果最后得到的結果中有重復項請記得 去掉重復項


    wehavemetimageset-2021-10-12

    接下來繼續看 除運算 ,書上之所以用了象集的概念來定義,我覺得是因為除運算實際上是 求象集的 “反向操作” ,從結果找源頭 ,看接下來這個例子:

    division1.1-2021-10-13

    上面這個例子中結果得到的是 單屬性列A,下面我們再來個相除得到 屬性組 的例子:

    division2-2021-10-13

    總結一下就是:

    1. 這里的 除運算 可以看作是 求象集的反向操作 。比如我算 R ÷ S,其實就是找 S關系和R關系相同的部分R中誰的象集

    2. 通過上面兩個例子可以發現,除號前面關系的元組數 一定 除號后面關系的元組數。例如我算 R÷S ,如果R的元組數<S的元組數,是肯定除了個寂寞的

    3. 另外,進行除運算的兩個關系必須要有 共同的屬性列 , 不然運算是沒有任何效果的。


接下來要談到的是另一個重頭戲—— 連接 了...

scaredmio-2021-10-13

連接的符號是 ,一般連接是對 進行操作,一部分情況(自然連接)下連接還要 進行(去重)操作。

連接因為條件不同,被分為了 θ連接等值連接自然連接 幾種,咱也准備分開記這幾個了~

  • 連接必需的一步

    basicofthejoin1.1-2021-10-13

    連接其實等同於從兩個關系的 廣義笛卡爾積 中按 條件 進行 選擇,運算式中⋈符號下面的表達式其實和選擇里的F一樣是 邏輯表達式,但要注意,這里邏輯表達式θ兩端用於比較的屬性組是有限制的,詳細看下面的θ連接

    例子中得到的R和S兩個關系的廣義笛卡爾積:

    展開查看
    ID NAME R.COURSEID S.COURSEID TEACHER
    20230102 新一 1 1 趙向前
    20230102 新一 1 2 李先生
    20230102 新一 1 3 張前程
    20230102 新一 1 3 麥當勞
    20230102 新一 1 5 龍井茶
    20230103 高二 2 1 趙向前
    20230103 高二 2 2 李先生
    20230103 高二 2 3 張前程
    20230103 高二 2 3 麥當勞
    20230103 高二 2 5 龍井茶
    20230104 張三 3 1 趙向前
    20230104 張三 3 2 李先生
    20230104 張三 3 3 張前程
    20230104 張三 3 3 麥當勞
    20230104 張三 3 5 龍井茶
    20230105 李四 4 1 趙向前
    20230105 李四 4 2 李先生
    20230105 李四 4 3 張前程
    20230105 李四 4 3 麥當勞
    20230105 李四 4 5 龍井茶

    其中屬性列 ID , NAME , R.COURSEID 是原關系R的屬性列,而 S.COURSEIDTEACHER 是原關系S的屬性列

    在接下來的示例中,咱就用這張表來做示例了嗷~(/▽\)

  • θ連接

    θ連接其實簡稱就是連接,很有存在感的便是 代表比較運算符的 θ 了( ̄□ ̄;)
    廢話不多說,我們先上直觀例子:

    thetajoin1-2021-10-13

    thetajoin2-2021-10-13

    thetajoin3-2021-10-13

    主要操作就是從兩個關系的廣義笛卡爾積中 按條件進行選擇 了,由此很大程度上可以參考上面的 選擇 部分。盡管如此,還是要注意這些限定:

    1. R ⋈ S(邏輯表達式:A θ B) 進行舉例,A屬性組 只能在 R 這部分選,而 B屬性組 只能在 S 這部分選。

    2. AB是屬性組,那么A和B的 度數(列數) 一定要相同

    上面舉的例子可能還有點不清不白,其實咱還可以皮點嘛( ̄^ ̄)ゞ,比如說這樣寫:

    thetajoin4.gif-2021-10-13

    在邏輯表達式中我們將學號 ID 和課程號 S.COURSEID 相比。可想而知,因為在廣義笛卡爾積結果中學號是恆大於課程號的,所以結果自然是:

    thetajoin5-2021-10-13

  • 等值連接

    等值連接是基於 θ連接 的,不同的是等值連接規定 θ是等號=,話不多說,直接上例子:

    equivalentjoin-2021-10-13

  • 自然連接

    關系R與關系S自然連接表示為:R ⋈ S

    自然連接是在 等值連接 上的擴充,不過自然連接有了新的要求:

    1. 邏輯表達式中進行比較的兩個屬性組 AB 必須是相同的屬性組

    2. 自然連接結果中要 去除重復的屬性列

    3. 結合上面兩點,自然連接 過程中一定 會有 重復列 出現。

    第1點 來說,比如上面的例子中,R.COURSEID 是R關系中的COURSEID屬性列,而 S.COURSEID 是S關系中的COURSEID屬性列,他們都是COURSEID屬性,都是課程號,所以可以進行自然連接。

    如果我拿R關系中的 ID 和S關系中的 COURSEID 屬性列作為比較對象,因為二者並不是同一個屬性名,無法進行自然連接

    第2點 的話咱還是整個例子(緊接上一個等值連接的例子,因為等值連接舉的例子中R關系的COURSEID和S關系的COURSEID是同一個屬性):

    naturaljoin-2021-10-13

  • 外連接

    外連接則又是在 自然連接 上的擴展(一環套一環啊喂(°ー°〃) ),它與自然連接不同的地方是 保留了懸浮元組

    什么是 懸浮元組

    danglingtuple-2021-10-17

    在進行自然連接后,原 R關系S關系 中因為不滿足條件,可能有 元組 沒有在連接結果中出現,也就是在連接過程中被拋棄了,這些被拋棄的元組就是 懸浮元組。(順便學個新的英語單詞:dangle[verb.]懸掛,懸垂

    上面的例子中的懸浮元組是:

    ID NAME COURSEID
    20230105 李四 4
    COURSEID TEACHER
    5 龍井茶

    那么什么是 外連接

    外連接其實就是在自然連接結果關系中保留 所有的懸浮元組,結果中屬性的未知值就填上NULL

    我們在上面自然連接的結果中示例外連接:

    outerjoin-2021-10-17

    外連接保留了RS關系中所有的懸浮元組,這些懸浮元組在最終結果中會缺值,我們將這些缺值全部記為NULL

    在外連接之中,還有 左外連接(左連接)

    leftouterjoin-2021-10-17

    左外連接則只保留 連接符號左邊 的關系的 懸浮元組,同樣缺值記為NULL。例子中保留的是R中的懸浮元組。

    那么,右外連接(右連接) 做的事就顯而易見了:

    rightouterjoin-2021-10-17

    右外連接則只保留 連接符號右邊 的關系的 懸浮元組,同樣缺值記為NULL。例子中保留的是S中的懸浮元組。

    結合上面的外連接,左外連接,右外連接,我們發現:

    relationsbetweenouterjoins-2021-10-17

    也就是 外連接 = 左外連接 ∪ 右外連接

    感謝你看到這里,至此這篇文章的主要內容就結束啦!放工啦放工!╰( ̄▽ ̄)╭

    Imtired-2021-10-17

0x04 After all

pleasedtomeetyouguys-2021-10-17

這篇文章寫出來一方面是當作我自己學習的筆記,將來如果我忘記了(這個將來可能離現在不遠了,我記性很差TAT)能隨時撿起來,所以在我的角度上盡可能地表達詳細了;另一方面也是希望能多多少少幫助到大家,畢竟現在關於關系代數的知識在網上還是有點分散的。

因為這篇文章寫了兩周,中間可能因為時間間斷導致我突然想不起來之前想寫什么了,可能有遺漏或者寫錯的地方,也請各位多加指教。

寫完后咱覺得動圖播放速度可能還是有點快了,於是有了寫個關系代數演示小工具的想法,稍后將作為上方的0x00環節放出,目標是能讓看到該文章的各位(包括我自己)在動手中加深理解。

附表

展開查看
  • 0x01 小概念 使用的表格:

    學號 姓名 性別 年齡 所在系
    20230102 新一 18 CS
    20230103 高二 20 CS
    20230104 張三 19 MA
    20230105 李四 18 IS
    20230106 王五 19 CS
    20230107 趙六 21 IS
  • 0x02 傳統的集合運算 使用的表格

    1. 前提,並,差

      學號 姓名 性別
      20230102 新一
      20230103 高二
      20230104 張三
      學號 姓名 性別
      20230104 張三
      20230105 張三
      20230106 李四
      20230107 王五
      20230108 趙六
    2. 學號 姓名 性別
      20230102 新一
      20230103 高二
      20230104 張三
      學號 姓名 性別
      20230106 李四
      20230107 王五
      20230103 高二
      20230104 張三
      20230108 趙六
    3. 笛卡爾積

      老師 課程所在專業 課程
      張前程 計算機專業 高數
      張前程 計算機專業 離散
      張前程 計算機專業 線代
      張前程 信息專業 高數
      張前程 信息專業 離散
      張前程 信息專業 線代
      趙向前 計算機專業 高數
      趙向前 計算機專業 離散
      趙向前 計算機專業 線代
      趙向前 信息專業 高數
      趙向前 信息專業 離散
      趙向前 信息專業 線代
    4. 廣義笛卡爾積

      A B C
      a1 b1 c1
      a1 b2 c2
      B C D
      b2 c2 d1
      b3 c2 d3
      學號 姓名 性別
      20230102 新一
      20230103 高二
      課程名 課程號
      高數 233
      離散 450
      線代 777
  • 0x03 專門的關系運算 使用的表格

    1. 選擇

      示例一同 0x01 小概念 使用的表格,示例二如下:

      ID NAME SEX CREDIT TARGET
      20230102 新一 52 54
      20230103 高二 48 44
      20230104 張三 36 34
      20230105 李四 48 50
      20230106 王五 56 60
      20230107 趙六 42 60
    2. 投影

      選擇 的示例二表格

    3. A B C
      a1 b1 c2
      a2 b3 c7
      a3 b4 c6
      a1 b2 c3
      a4 b6 c6
      a2 b2 c3
      a1 b2 c1
      B C D
      b1 c2 d1
      b2 c1 d1
      b2 c3 d2
      A B C D
      a1 b1 c2 d1
      a2 b3 c1 d1
      a3 b4 c6 d2
      a1 b2 c3 d2
      a4 b3 c6 d1
      a2 b3 c3 d2
      a1 b2 c1 d1
      C D F
      c1 d1 f1
      c3 d2 f2
    4. 連接

      ID NAME COURSEID
      20230102 新一 1
      20230103 高二 2
      20230104 張三 3
      20230105 李四 4
      COURSEID TEACHER
      1 趙向前
      2 李先生
      3 張前程
      3 麥當勞
      5 龍井茶

特別感謝

References


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM