天天看點

資料庫關系模型和關系運算[姊妹篇.第三彈]

随着ORM架構的日益流行,如今的碼農們直接操作資料庫文法的越來越少了,一頓orm文法操作猛如虎,一遇問題問題便靓仔語塞。這種情況不在少數,就如我的工作中,我所知道的同僚和實習生當中,就有不少人非常喜歡linq文法以及lamda表達式來滿足日常的db操作。然而,常在河邊走,哪有不濕鞋,經常一堆linq連表操作下來遇到一系列問題,又或者是要求其編寫一些sql函數來解決相關複雜問題,便無從下手。嗯?不太會玩sql文法了,跟你這關系運算有啥關系?嗯,接着看。

資料庫關系模型和關系運算[姊妹篇.第三彈]
資料庫關系模型和關系運算[姊妹篇.第三彈]
關系模型概念
           

首先針對這些名詞抛出疑問,到底什麼叫關系?啥叫關系模型?啥又叫關系代數?

關系:我們對它的解釋是這樣的,所謂關系,就是一張表。表的各列以屬性開始,屬性是列的入口。

關系模型:關系模型用一種稱為“關系”的二維表來表示資料。通俗的講就是說,一張表就可以泛指一個關系模型,表與表之間的又存在關系。關系模型也就是資料模型,也可以稱為表與表之間的關系。

屬性:屬性就是關系(表)的标題欄中各列的名字(也成為字段名)。

元組:除了關系的标題欄以外,其他各行統稱為“元組”,也就是每一行行的資料。

域: 關系模型要求每個元組的每個分量都是原子的,即必須屬于某種基本類型,如整型或字元串型,而不允許一個值的結構、集合、清單、數組或者能分解為更小分量的其他任何類型。通俗的講就是每一個表的字段都有一種類型聲明,它可能是string、int、text,double等其中的一種。

資料庫關系模型和關系運算[姊妹篇.第三彈]

▲圖/ 來源網絡

資料庫關系模型和關系運算[姊妹篇.第三彈]
關系代數
           

我們了解資料庫中的關系模型,也就是資料表的一些定義,那麼我們是不是需要對關系表進行操作來滿足使用者需要的表現層資料?那麼啥又叫關系代數呢?

資料庫關系模型和關系運算[姊妹篇.第三彈]

▲圖/ 來源網絡

關系代數:關系代數是一種抽象的查詢語言,用來對關系的運算來表達查詢,作為研究關系資料語言的數學工具。就是說關系代數是我們對表的的查詢來滿足使用者所需要的表現層。

關系代數中包括了:并、交、差、乘、選擇、投影、聯接、除、自然聯接等操作。那這些關系代數中的名詞我們又是怎樣了解呢?

普通集合運算并、交、差這麼幾種:R∪S,R和S的并集,R∩S,R和S的交集,R—S,R和S的差。

在操作資料文法當中,我們對針對大量的資料中篩選使用者需要的資料,就會用到這麼幾種運算:

選擇運算:選擇運算會删除某些行(元組),選擇運算符号是σ,該運算作用于關系R将産生一個新關系S(類似加條件查詢)。

投影運算:投影運算會删除某些列。投影運算符号是π,該運算作用于關系R将産生一個新關系S。(類似選擇列查詢)。

笛卡爾積:兩個關系R和S的笛卡爾積記作R × S,它是一個新的關系,其關系模式是R和S的并集。

這個怎麼來了解呢,我們用一組sql來示例:select * from table1 , table2。

自然連接配接:兩個關系R和S的自然連接配接,記作R⋈S。(隻有兩個關系的元組所在公共屬性上取值相同,才可以将他們的組合放入兩個關系的自然連接配接中)。

例如:select * from student natural join score。此種連接配接也不需要 ON這種條件,直接會将公共屬性相同的數列檢索出來。

資料庫關系模型和關系運算[姊妹篇.第三彈]
關系演算
           

關系演算,把數理邏輯中的謂詞演算應用到關系中的謂詞演算應用到關系中,就是所謂的關系演算。以元組為變量稱為元組關系演算,而以域為變量,則稱為域關系演算。

關系演算要怎麼來了解呢?首先我們知道這麼幾種謂詞:GET,PUT,HOLD,UPDATE,DELETE,DROPGET。第一種是資訊查詢,後面幾種是更新作用。以下将給出幾個關系演算的例子。

當我們想要查詢學生的分數時,則可有表達式如下:

GET W (student.score)

查詢計算機科學系(CS)學生的學号、年齡,結果按年齡降序排序:

GET W (student.sno,student.sage): student.sdept=‘CS’ DOWN student.sage

其中:排序關鍵字:UP升序 DOWN降序.

查詢選修2号課程的學生名字:

RANGE SC X GET W (student.sname): 存在X (X.sno=student.sno∧X.cno=2)

好了,資料庫的關系模型和關系代數相關的内容就此交代了,如果夥伴們熟練的話,在你手動操作資料庫的時候便會清楚何時情況下利用關系代數巧妙的檢索出使用者表現層的資料。在我的工作中,其實很多問題直接可以通過一組sql解決的,我本人也是比較喜歡寫一些sql函數去解決更多複雜的實際場景問題。

資料庫關系模型和關系運算[姊妹篇.第三彈]

▲圖/ 來源網絡

那麼接下來的篇章就會面向查詢優化了,我相信一些簡單的crud查詢文法大家都是熟練的,是以我們就談談資料庫的性能優化。那麼我将提前抛出幾個問題:

1.傳回表中0.014%的資料應不應該走索引?

2.什麼樣的列必須建立索引呢?

3.嵌套查詢、HASH連接配接、排序合并連接配接、笛卡爾連接配接等怎樣玩能達到最優?

3.IN 與EXISTS 誰快誰慢?