天天看點

《視圖更新與關系資料庫理論》——2.2 關系指派

本節書摘來自異步社群出版社《視圖更新與關系資料庫理論》一書中的第2章,第2.2節,作者:【美】c.j. date(達特),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

tutorial d中的關系指派文法,不是像insert或delete一樣的縮寫,而是使用如下的通用格式。

在這裡“r”是一個關系變量(從文法上來說,其實就是一個關系變量的名字),“rx”是一個關系表達式,表示關系“r”和關系變量“r”是同一類型的。現在顯而易見的是(這裡要感謝david mcgoveran的觀察)任何這類指派都在邏輯上等價于下列格式之一。

在這裡:

r是r的“原有”值。

d是将要從r中删除的數組的集合(“删除集合”)。

i是将要被插入到r中的數組的集合(“插入集合”)5[5]。

dr,即d是r的一個子集,意味着我們不可能删除任何不存在的數組。

i和r交集為空(意味着我們不可能插入任何已經存在的數組)。

d和i的交集也為空。

d和i是被清晰定義并且唯一的6[6]。

以上幾點可以很友善地用文氏圖來解釋清楚,如圖2.2所示。解釋說明:在這個圖表中r、d和i如上面所述,u則是與它們同類型的全域關系(換句話說,u是由所有與r具有相同關系頭的數組所組成的關系,當然也包含那些已經在r之内的數組)。請注意u-r的差集是r的絕對補集(也就是說,u-r是由所有與r具有相同關系頭,但不包含在r之内的數組所組成的關系)。

當然,删除集合d有可能為空,在這種情況下,之前的指派效果就相當于一個純粹的insert操作。或者當插入集合i為空時,指派效果就相當于一個純粹的delete操作。又或者,d和i都為空,那麼指派操作的效果就會退化為一個“空操作”r := r。

《視圖更新與關系資料庫理論》——2.2 關系指派

根據以上所說的,原來的指派r: = rx實際上等價于下面的“多重”指派(“多重指派”詳見本節後面的詳細介紹)7[7]。

如此一來,雖然我前面曾經說過這類關系指派其實是我們唯一需要的更新操作,但是我們還是可以始終把它想成delete和insert這兩個操作(從感覺上來講,好像還是這樣想起來友善一些)。這是因為當我們遇到一個很可能發生的随機的針對關系變量r的多重指派時,包括前面例子中這種用公式表達的比較清晰的對r的update操作,我還是建議将指派轉化為一個對r的delete操作和一個對r的insert操作,畢竟删除集合d和插入集合i是明确定義的、交集為空的,和獨一無二的。注意:由于這裡已經講過了比較清晰的update操作,是以接下來我隻有在遇到值得說的地方才會再次讨論這個問題。同樣,我也會忽略d和i在實際運算中所碰到的大多數問題。和我其他大多數作品一樣,在本書中我首要關注的是先要讓大家明白這個理論,而不是首先關注實際執行中出現的問題。當然,我并不是說實際操作當中遇到的問題不重要。au contraire(法語:恰恰相反),實際上檢查實施操作的可行性對確定本理論的正确性是至關重要的。

文法要點

我在這裡再次重申,關系指派r: = rx在邏輯上等價于:

請一定注意,正是因為d和i的交集為空,是以無所謂delete或者insert哪個操作“先進行”。(關于這個問題我一會兒還要再多說一點,即在多重指派的情況下獨立操作的完成情況。)是以,我們等于可以這麼說:原始指派邏輯上與下面任意一個關系表達式等價。

我們甚至可以說它也和下面任意一個關系表達式等價。

i_delete d from r , d_insert i into r

d_insert i into r , i_delete d from r

delete ( s where sno = ‘s1’ ) from s ,

delete ( sp where sno = ‘s1’ ) from sp ;

s := ... , sp := ... ;

update r : { k := k + a } ;

update r : { a := -a } ;

r := relation { tuple { k 1 , a -2 } , tuple { k 3 , a 2 } } ;