天天看點

《視圖更新與關系資料庫理論》——2.6 資料庫與資料庫變量

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

這是本章的最後一節。在本節中,我希望你們能注意一個重要的事實,正如關系值與關系變量(relvars)之間有邏輯差別一樣,資料庫值和資料庫變量(dbvars)之間也存在着邏輯差異。下面一段引自《宣言》那本書。

第 1 版的“宣言”将資料庫的本質(也就是資料庫的值)與資料庫變量進行了區分……[同時也]指出未明确定義的詞彙“資料庫”應該就是明确地代表資料庫的值,并介紹了作為“資料庫變量”的縮寫來使用的詞彙“dbvar”。雖然我們依然相信這個差別本身是真實有效的,但随即我們發現其實它與“宣言”所要講的其他方面内容幾乎沒什麼關系。是以我們決定,為了文章的易讀性,還是在文中使用傳統的說法。19[19]

于是,當我們“更新某些關系變量”(在某個資料庫内部)時,實際上我們更新的是相應的資料庫變量。(為了表述清晰,在本節的其餘部分我都将使用資料庫變量這個詞。)例如,tutorial d聲明

“更新裝置供應關系變量sp”其實是更新了整個供應商-零部件資料庫變量—對這個資料庫變量的“新的”資料庫值和“老的”值基本一樣,除了特定的“裝置供應”數組被移除了。換句話說,有時候我們會說一個資料庫“包含變量”,即相應的關系變量,其實這種說法很籠統,而且很不正式。更加正式的并且更準确的描述方式應該是這樣的:

資料庫變量就是數組變量。

數組變量對該資料庫變量中的每一個關系變量都擁有一個唯一的屬性(并且沒有其他屬性),并且每個屬性都有關系值。我們舉例來說,在供應商-零部件資料庫中,我們可以将整個資料庫變量想象成一個數組變量(也可以用“tuplevar”表示),數組類型如下:

讓我們暫時稱供應商-零部件資料庫變量(或者也可以叫它數組變量)為spdb。20[20]那麼上面我們剛剛看到過的delete聲明可以作為下面的“資料庫”(以及數組)指派。

解釋說明:這個指派右側的表達式表示一個數組擁有3個屬性分别叫作s、p以及sp,每一個屬性都擁有關系值。21[21]在數組内,屬性s的值就是目前關系變量s的值,屬性p的值就是目前關系變量p的值,而屬性sp的值則是在目前關系變量sp的值的基礎上,減去那些數量小于150的數組。

我們來看另一個例子,這裡我們再次使用“雙删除(delete)”,我在本章早些時候介紹多重指派概念的時候曾經使用過。

現在我們觀察這個關系指派,很明顯是個多重指派,會發現它邏輯上等價于下面的“單一”資料庫(以及數組)指派。

換句話說,目标變量全部都是同一個資料庫(或者說同一個資料庫變量)中的關系變量,多重指派其實僅僅就是一個文法工具,它可以讓我們将邏輯上的“資料庫”指派表達成一個一系列獨立“關系”指派的組合(請參看下面關于此點更多的讨論)。而一個“單一”的關系指派,例如由隻針對一個單獨的資料庫變量進行的一個單獨的指派所組成的“多重”指派—僅僅是個特例。從根本上來說,事實上目前對資料庫更新來講,資料庫變量是唯一真正的變量。這就是說,資料庫更新其實“總是”對某些資料庫變量進行更新,而對單一一個資料庫關系變量的更新僅僅是特例而已。

根據上面所有的内容,如果目标關系變量是一個資料庫關系變量(就是說,如果這個目标關系變量是某個資料庫中的關系變量),那麼即使一個“單一”關系指派其實也是一個資料庫指派。當然,這個資料庫指派像所有的指派一樣,都必須遵循“指派原則”,并且正由于它是一個資料庫指派,它也同樣需要遵循“黃金法則”。

我們前面講到的這些想法太重要了,它值得我們再次複習一遍,隻是說法有輕微的不同。首先,資料庫變量是數組變量,資料庫(也就是在給定的時間,給定的資料庫變量所具有的值)是所有屬性都有關系值的數組。第二,給定一個關系指派如下面格式。

(這裡r是一個關系變量參考量,從文法上講就是一個關系變量的名稱,指出了一些資料庫關系變量,而rx是一個關系表達式,表示關系r與r具有相同類型)這個關系變量參考量r其實是一個“僞變量”參考量(請立刻參看本段下面的注解)。換句話說,關系指派其實是針對相對應資料庫變量(再次重申它就是數組變量)的一個部分進行“替換”的簡稱化表達方式。是以我們推斷出“關系變量”(至少是在資料庫中的關系變量)并不是真正的變量,它們隻是一些讓人覺得很便利的虛構的變量,能夠制造出這種假象:資料庫或資料庫變量可以一點一點地、一個關系變量一個關系變量地被更新。我們進一步可以推斷出,在某種意義上,“關系指派”(不管是不是多重的)也同樣是個友善的假象,具體來說就是它是一個虛拟操作,讓我們感覺好像可以通過一系列針對這個資料庫内的單獨的關系變量的更新,來實作對資料庫變量的更新。22[22]

關于僞變量的注解:從本質上講,僞變量是這樣一個概念,或者是這個概念的象征性的名字,它看起來像是個可操作的表達式,但不同的是它并不表示任何值;相反地,它出現在某些指派中的目标位置,來表示“變量的一部分”。我們舉個例子,令x為一個char類型的變量,并令x目前的值是“antimony”。那麼指派表達式substr(x,5,3) := ‘nom’的效果就是“替換”x的第5~7個字元,将“mon”替換成“nom”,并是以将x的“舊的”值(“antimony”)完全替換成“新的”值(“antinomy”)。這個指派左側的substr(x,5,3)就是一個僞變量參考量,而這個指派本身則是下面表達式的簡化版:x := substrx(x,1,4) || ‘nom’ || substr(x,8,1),在這裡符号“||”表示字元串連接配接。注解完畢。

為了本書的易讀性和定義的明确性,雖然有違我的最佳判斷,但我還是決定在本書餘下的部分不再使用資料庫變量和“dbvars”這兩個專用術語,至少不會用很多次,而是使用大家熟悉的“資料庫”,希望我要表達的意思在上下文中總是很清楚。讀者要擦亮眼睛。

[1] 說這個語言是假設的,僅僅是因為到我撰寫本書的時間為止,市場上還沒有一個正式發售的商業版本。但是它的設計原型已經存在,可以通過下面的網址來通路:www.thethirdmanifesto.com (請參看下面緊跟着的另一個注腳)。

[2]  tutorial d從該書第1次出版以來已經被修訂和擴充。關于新版本(已經有改善,但和本書中使用的并不完全相同)的描述可以在我和hugh darwen合著的《database explorations: essays on the third manifesto and related topics》(trafford, 2010)中找到,同樣可以通路網站www.thethirdmanifesto.com來獲得相關資訊(這本書同時還有很多其他關于“宣言”的内容)。

[3] “邏輯差異”這個概念,是我和darwen在撰寫技術文章時很愛使用的一個概念(特别是在關于《the third manifesto》的文章中),它來源于wittgenstein(英國哲學家、數理邏輯學家維特根斯坦)的一句名言:all logical differences are big differences(所有邏輯上的差異都是巨大差異)。

[4] “縮寫”在這裡用引号括起來是因為其實它要比需要縮寫的部分還長。但是一部分原因其實應該歸咎于我使用的是不規範的tutorial d術語(在真正的tutorial d文法中,delete語句應該寫成delete s where city = ‘london’)。在本書中我特意選擇了稍微啰嗦一點的文法來表達delete(和insert),這也是為了讓它們的語義足夠清晰。

[5] 嚴格來說,d和i當然不僅僅是“數組的集合”,而是和r同一類型的關系。

[6] 請參看附錄a中對此命題的證明。

[7] 真正在tutorial d中對于多重指派的語句應當是delete r d, insert r i。

[8] 如果遇到兩個或更多獨立指派擁有相同的目标變量,那麼這個定義就需要被改進,不過目前我們還用不到這些。可以參看附件a來獲得更多解釋說明。

[9] 我将在這裡和全書其他地方都使用這種簡單的表示法來表示數組,以便大家閱讀。

[10] 這個指派在等号右側的表達式是一個“關系選擇器調用”,其實就是一個關系“字面量”。如果你想獲得對相關内容的詳細解釋,請參考《sql and relational theory》。

[11] 關系變量s是個基礎變量,這是肯定的。關于視圖的情況,請見第3章。

[12] 這裡也有例外,有些限制可以用key和foreign key的方式來表達,但即使是這些限制本質上也僅僅是限制的縮寫形式,它們都可以使用constraint清晰地進行聲明,隻不過會比較冗長。請參看《sql and relational theory》一書來獲得關于這一點更深入的讨論資訊。

[13] 我在這裡簡單一點說:限制的效果很強大,一些關系選擇器調用确實會讓所需類型的關系檢查得“更迅速”,甚至把檢查作為得出關系選擇器調用結果的流程中的一環。同樣,請參看《sql and relational theory》一書來獲得關于這一點更深入的讨論資訊。

[14] 這段注文是從《database design and relational theory》中截取過來的,我進行了少量編輯。注意:我曾經在前言就提醒過你,在本書中我會使用《database design and relational theory》作為縮寫的形式來表示引用我的《database design and relational theory: normal forms and all that jazz》(奧萊利,2012)。

[15] 我想強調“當且僅當”。這裡至少有一個重要的推論。具體來說就是令關系變量r1和r2分别擁 有謂詞p1和p2,那麼當p1和p2同時被同一個數組t滿足時,t必須同時出現在r1和r2中。 (雖然這是一種經驗法則,但它可能是一個很好的方式來確定p1和p2足夠特殊以排除前面的可能 性。但是請注意,在第4章以及第9~11章我們将看到一些蓄意違反這個原則的情況出現。)

[16] 這裡我要說明,我們發現一件很便利的事情,就是在tutorial d的所有操作中,可以把最高優先級 設給投影。

[17] 是以,我們可以将閉域假設加以擴充。在一個給定的時間内,我們設一個命題p在對應數組t并且 在數組t滿足下列條件時為真:(a)數組t在該時間(前面所說的給定的時間)内出現在某個資料 庫的關系變量中,或者(b)數組t在該時間内出現在某個關系中,并且可以由該關系推導出數組 t就是這個資料庫關系變量的值。我們換一句簡單點的話來說,就是所有由資料庫聲明或說明的均 為真,其他均為假。

[18] 我做這個标記是為了說明著名的關系差操作—tutorial d中的minus是not matching的 一個特例。具體來說就是如果關系r1和r2是相同類型,那麼r1 not matching r2會簡化為r1 minus r2,這一點可以很容易确認。是以,相對來說not matchig比minus更加基礎。

[19] 換句話說,我們繼續使用“資料庫”這個詞,時而表示資料庫變量,時而表示資料庫值,并且我們 壓根不使用database variable或者dbvar這兩個詞。但是後來我們發現,因為種種原因我們沒有設 計這部分是一個非常錯誤的決定。(做一些你知道的邏輯上錯誤的事情通常不是個好主意。)至于我 在本書中将計劃如何來使用這個術語,請參看本節剩餘的部分。

[20] 如果我們想要像這個例子中一樣寫出清晰的資料庫指派,那麼資料庫變量就必須擁有使用者可見的名 字,但在tutorial d中它們沒有(至少按照目前的定義來說)。

[21] 實際上,上面這個表達式是一個數組選擇器調用。再次說明,如果你想獲得關于這個的更多說明, 請參看《sql and relational theory》。

[22] 從這個讨論中我們可以看出多重關系指派是極其重要的(在缺少明确的對資料庫指派的支援的情 況下),實際上它對于後面章節要讨論的一些特定的視圖更新規則來說非常的關鍵。是以在這種情 況下,我要說,請原諒我在這裡指出,很不幸,至少sql不支援這個操作。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。