1. 程式人生 > 其它 >資料庫關係模型和關係運算[姊妹篇.第三彈]

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

隨著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連線、排序合併連線、笛卡爾連線等怎樣玩能達到最優?

4. IN 與EXISTS 誰快誰慢?