網際網路與資料庫的對話錄
[ 目錄 ] / [ 本節目錄 ] [ 上一篇 ] [ 下一篇 ]


第六章、關聯式資料模式

陳尚寬

2002/06/18


第一節、表格與鍵值

小君覺得意猶未竟,當下決定留下來不走,繼續糾纏著小博,看看能不能從他身上多挖出一些關於資料庫系統的寶藏:「對於關聯表格,你能不能再講解得深入一點啊?哥哥,我很有興趣呢。」

擁有真材實料的人,當然不怕別人硬磨,只見小博擺出一副無所謂的態度,雙手一攤,面帶微笑地說:「當然可以啊,只要學生想學,老師當然要認真教囉。」

小君伸出雙手緊抓著小博又粗又狀的雙臂膀,用力搖晃著說:「快點說嘛!快點說嘛!」

小博被小君前後搖得七葷八素,趕緊撥開小君的手並回答:「好,好,男女授授不親,首先我們先從表格的資料結構開始談起。每個表格都會有一個名稱,用來分辨每一個表格。而每個表格都會含有一個或一個以上的欄位,我們稱之為屬性。」

小君睜大了眼睛呆望著小博,一臉不解地問道:「蝦米是『屬性』碗糕啊?有點玄耶!」

小博也睜大了眼睛回望著小君,同時邊打哈欠邊說:「屬性嘛,就是一個主體所被賦予的性質囉。就像當我們在規劃所有部門的表格時,總是要知道所有部門的名稱、所有部門的編號、以及部門的主管是誰,這些不都是必要的欄位嗎?而這些欄位也就被稱為部門表格的屬性了。」

小君被看得有點不好意思,連忙露出一臉「知了(ㄌ一ㄠˇ)」的模樣,俏皮地遮住眼睛說:「原來是這樣啊,那我知道了,還有嗎?」

小博也恢復正常,不再繼續瞪著小君,只見他的手伸向背部,一邊抓癢一邊說:「還有每個欄位的值都稱為屬性值,而屬性值的範圍就稱為值域,關聯表本身就是由一筆一筆的記錄所組成的,我們也稱一筆筆的記錄為值組囉。夠不夠清楚啊?我的大小姐。」

看著小博拙劣的抓癢姿勢,小君一邊偷笑一邊回答:「嗯,到目前為止都還聽的懂。」

從小君的偷笑中,小博知道自己抓癢的姿勢鐵定超級難看,於是又用力抓了最後幾下,就停止不再抓了,整理了一下衣服,清一清喉嚨後,才慢慢地說:「接下來要談論的觀念就比較複雜了,妳可要注意聽喔。」

小君學電視廣告舉起右手,一邊笑一邊唸:「這是一定要的啦!這是一定要的啦!不然你就不教我了」

小博一面搖頭看著小君耍寶,一面對小君提出問題:「如果某一個屬性的屬性值保證獨一無二,就像學生的學號或身份證號,有一個這樣的屬性會有甚麼好處?」

被小博這麼一問,小君趕緊停止耍寶中的動作,認真地回答問題:「這個嘛,嗯…我想最重要的是應該不會混淆吧,如果有學號可以對到不同的學生姓名,那不就天下大亂了。」

小博覺得小君還不太能夠瞭解這個問題的重點,因此決定延伸小君的解釋:「沒錯,我們在建立一個表格的時候,的確會需要有這樣的一個屬性,這個屬性就相當於這個表格的鑰匙,所以這樣的屬性,我們就叫它做key,中文就翻譯為鍵值。」

聽完小博的解釋後,小君才明白剛剛的回答真是有點牛頭不對馬嘴,於是趕緊應答掩飾:「嗯,形容蠻貼切的嘛,如果一把鑰匙能夠開兩扇門,感覺起來的確是怪怪的。」

小博非常滿意小君的補充,他繼續說下去:「的確是這樣沒錯,當然囉,在一個表格裡面,可能會有不只一個屬性具有鍵值的條件,而這些屬性,我們都稱它為候選鍵。」

小君身體前傾,使用一種非常誇張的語調說:「甚麼『候選』啊,怎麼資料庫系統也可以跟政治選舉扯上關係啦?師父哥哥,你有沒有說錯啊?」

小博也將身體往前傾,並把雙手搭在小君的肩膀上,又好氣又好笑地說:「妳嘛給我幫幫忙,妳的想像力還真是很豐富勒,這不是跟政治選舉扯上關係,而是這些候選鍵都有資格被我們挑選出來成為這個表格的主鍵值。」

小君仍是丈二金剛摸不著頭緒,只好用一臉「莫宰羊」的一號表情面對小博:「那蝦米又是主鍵值呢?你給我說說看。」

小博看小君一臉茫茫然的模樣,就知道她又彈盡糧絕,陣亡在前線了。為了挽救這位多年同袍好友,他只好盡己所能地解釋給她聽:「主鍵值是一個值組中唯一的記錄識別值,它扮演著非常重要的地位,因為它負責與別的表格產生關聯。不過主鍵值亦可以由多個非鍵值的屬性所組合而成,只要它們的組合所產生的值是獨一無二的就行了。」

聽完小博的解釋,小君決定用「自己的話」再說一遍,證明她不僅聽懂,而且已經百分百地瞭解:「是不是像全國政府機關的表格,縣市名稱會有重複,單位名稱也會有重複,但是二者組合起來之後,就是獨一無二的名稱了。」

小博一邊鼓掌一邊微笑地說:「對,妳說得完全正確。不過接下來的『外來鍵』觀念,會更難喔。」

聽到小博的警告後,小君又瞪大了眼睛,擺出一副全神貫注,準備洗耳恭聽的模樣:「那我可要好好聽了,小博哥哥,出招吧!」

小博咳了幾下,清一清喉嚨後才說:「外來鍵是表格的某一個欄位,其屬性值與另一個表格的主鍵的屬性值有相同的值域,如此形成表格彼此間的關聯。」

小君有點懂,但又沒有把握完全懂的表情全然浮現在臉上:「有相同的值域?ㄜ…ㄜ…表格間的關聯?ㄟ,那ㄟ按奈,小博哥哥,舉個例子說明一下好不好?」

小博想了一下要怎麼講小君才會真的明瞭呢,想了許久,終於讓他想到一個好範例,他急忙回答:「那當然囉,如果我們今天有兩份表格,一個是部門表格,一個是員工表格。員工表格裡面查不到部門的所在地是很正常的一件事,是不是啊?」

小博每說一句話,小君就跟著點一次頭,終於點到小博說完話了,小君也不需要再點頭,他趕緊揉一揉脖子,神情愉快地說:「沒錯啊,如果一個表格要容納所有必要與不必要的資訊,那不是把表格撐得很大,就算是我這個外行人也不會贊成這麼做。」

小博開始準備將前面所談論的一些概念慢慢地串連起來,逐漸變成一個較完整的觀念,為了讓小君融會貫通,它決定採取循序引導的方式:「妳說的很對,但是如果今天有人想知道某某員工是在那一個地理位置工作的話,那要怎麼辦呢?」

小君左想想右思思,終於給她想到了一個方案,她嘗試著將這個方案清楚地說出來:「那可能要求助於部門表格囉,因為部門位置正常應該是部門表格中的一個屬性嘛。」

小博繼續引導著小君:「對,我們是必須求助於部門表格,但是我們也必須知道這個員工的部門編號或是部門名稱囉。妳說呢?」

聽到自己的方案完全被小博肯定,小君心裡可樂得很。現在不管小博說什麼,她都一定點頭稱是:「那是當然的囉,不過員工表格也一定會有員工所屬的部門編號才對吧。」

小博覺得小君的學習能力很強,能夠一路追得那麼緊卻不會落後太多,也算是不簡單了。想到這裡,他露出一個燦爛的笑容,算是給小君打氣(這算是鼓勵嗎?):「是的,員工表格的部門編號就是一個外來鍵,它必須與部門表格的部門編號的值域相同,妳說是吧。」

小君故意模仿電影中僵屍的模樣,一邊跳呀跳地撲向小博一邊輕飄飄地說:「這是一定要的嘛,不然某某員工不就變成公司的幽靈人物了。」

小博眼看小君就要撲跳過來,連忙使出段譽的絕門武學—「凌波微步」,迅速跳往一旁,並且還臉不紅氣不喘地接著說:「那這樣妳了解了嗎?表格間就是靠相同的屬性值做聯繫的,也就是產生關聯。」

小君停止模仿僵屍的動作,伸出右手比了個OK的手勢,並且笑笑地說:「這樣我完全了解了。謝謝師父哥哥的解說。」

小博也學小君的口氣回答:「徒兒免禮。」

第二節、整合性限制條件

小君翻閱剛剛記錄下來的筆記,心中突然昇起一個疑問,於是揮手請小博過來,並客氣地問:「小博哥哥,我有個疑問想請教你耶,究竟一般的資料表欄位可不可以不用填任何資料啊。」

小博想了一下,認為這個問題包含在另外一個觀念底下,如果要解釋得好,就要先說明整個觀念才行,他說:「妳這個問題倒是讓我想到整合性限制條件的觀念。」

又是天外飛來一塊莫名的隕石,小君閃避不及,當場被擊個正著。小君只好搔搔頭,滿臉委屈地說:「哇勒,『整合性限制條件』?那又是蝦米碗糕啊?」

看著小君誇張的表情與動作,小博再也忍不住地笑了出來,過了好一會兒,小博才恢復正常,似笑非笑地說:「整合性限制條件,簡單來說,就是用來規範關聯式的資料表格。它分為個體整合限制以及參考整合限制。」

小君雖然聽過「不入虎穴,焉得虎子」,但勇闖虎穴的代價還真是高呀,一路上艱辛萬苦,困難重重,各式各樣的難題都有。小君只好硬著頭皮繼續問:「甚麼是『個體整合限制』,甚麼又是『參考整合限制』,弄得我暈頭轉向的,這又跟我的問題有甚麼關係呢?」

對第一次聽到這些名詞的人,一定會被搞得昏頭昏腦的,小博當初也是如此,所以他非常明白小君第一次聽到這些名詞的感受。他試著用一些淺顯的例子解釋給她聽:「妳剛剛的問題,就是被個體整合限制所規範,其他如主鍵的值不可以是虛值,輸入值的檢查等等,都是規範資料表內部的整合條件。」

就像倒吃甘蔗愈吃愈甜一樣,小君目前的學習狀況亦是如此:「你剛剛說的輸入值的檢查,是不是電腦可以自動幫我進行檢查,看看我輸入的資料有沒有錯誤或違反規則啊?」

小博在說下去之前,先給小君一個愛的鼓勵:「妳說的一點也沒錯。」

有了小博的鼓勵與支持,小君開懷地笑著說:「有了這個限制,我將來輸入資料時,錯誤就會減少許多,就不會常常挨老闆的罵了,耶,真棒!」

小博借機好好督促一下小君,希望她能夠對資料庫系統持續保持高昂的興趣:「所以你是不是應該要好好地學習資料庫系統啊,我的大小姐。」

小君甩了一下頭法,使用一種「超優伶」的語氣回答:「那是當然的囉。」

小博恢復正經的模樣,很認真地說:「好吧,接下來我告訴你甚麼是參考整合限制,它基本上是規範關聯表格彼此間的一種整合限制條件。」

小君搔了一下頭髮,順帶仰頭瞧了一下天花板,邊瞧邊說:「表格與表格間,還是不懂勒,你就舉個例子來說說嘛。」

小博已經觀察許久,發現小君有一個習慣性的招牌動作,就是在遇到不容易瞭解的觀念時,就會抓抓頭皮或搔搔頭髮,這真是一個有趣的發現啊!為了讓小君明白他講的觀念,他得利用剛剛談論過的「外來鍵」,於是他一面比手勢一面說:「還記得剛剛我們談論過的『外來鍵』嗎?」

小君ㄣ了老半天,終於迸出幾句話:「是不是表格中的一個欄位,其屬性值與另一個表格主鍵的屬性值域相同,你瞧,我背的不錯吧。」

小博搖搖頭,哭笑參半地回答:「是啊,是啊,但是會背也要會融會貫通才行。」

看到小博被自己逗得哭笑不得,小君心裡百味雜陳,只好豁出去繼續逗趣地回應:「遵命,師父又在教訓徒弟了,徒弟遵旨。」

小博伸手輕輕地打了一下小君,並擺出一副神聖不可侵犯的模樣,非常嚴肅地說:「只會耍嘴皮子,好了,我現在要開始舉例啦。就用剛剛的例子吧,妳想如果某個員工的部門編號,並不出現在部門表格中的部門編號裡面,這時候妳會希望電腦怎麼處理?」

小君瞪大眼睛直視前方,裝出一副真的很認真地在思考的表情,過了十幾秒後才學小博嚴肅的語氣回答:「電腦這時候應該通知使用者,讓使用者知道這個狀況,因為八成是輸入錯誤,或者部門資料表格太久沒有更新了。」

小博對這個同學真是沒有辦法,從高中時代開始就是班上的鬼靈精一個,不過從另一方面來看,只要她有興趣的東西,學起來比任何人都還要快精通:「妳說的一點也沒錯,設定這樣的整合性限制條件,就是要讓電腦知道,當使用者違反了一些關聯式資料表所預先設定的規則時,就應該通知使用者改變其輸入,來維護關聯式資料表間的完整性與一致性。」

小君趕緊在筆記本上速記小博說的每一句話,這些資料對她而言,都是很寶貴的資訊,她決定回家後,好好地瀏覽一遍,把今天學到的觀念再溫習一遍,期望能夠融會貫通:「耶!我又學到一課了,謝謝師父哥哥的教導。」

小博看著小君整理筆記,同時愉快地說:「快別這麼說。」


[ 目錄 ] / [ 本節目錄 ] [ 上一篇 ] [ 下一篇 ]


lake@mail.bamboo.hc.edu.tw