淺談數(shù)據(jù)庫設(shè)計(jì)技巧_第1頁
淺談數(shù)據(jù)庫設(shè)計(jì)技巧_第2頁
淺談數(shù)據(jù)庫設(shè)計(jì)技巧_第3頁
淺談數(shù)據(jù)庫設(shè)計(jì)技巧_第4頁
淺談數(shù)據(jù)庫設(shè)計(jì)技巧_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、說到數(shù)據(jù)庫,我認(rèn)為不能不先談數(shù)據(jù)結(jié)構(gòu)。1996年,在我初入大學(xué)學(xué)習(xí)計(jì)算機(jī)編程時,當(dāng)時的老師就告訴我們說:計(jì)算機(jī)程序數(shù)據(jù)結(jié)構(gòu)算法。盡管現(xiàn)在的程序開發(fā)已由面向過程為主逐步過渡到面向?qū)ο鬄橹?,但我還是深深贊同8年前老師的告訴我們的公式:計(jì)算機(jī)程序數(shù)據(jù)結(jié)構(gòu)算法。面向?qū)ο蟮某绦蜷_發(fā),要做的第一件事就是,先分析整個程序中需處理的數(shù)據(jù),從中提取出抽象模板,以這個抽象模板設(shè)計(jì)類,再在其中逐步添加處理其數(shù)據(jù)的函數(shù)(即算法),最后,再給類中的數(shù)據(jù)成員和函數(shù)劃分訪問權(quán)限,從而實(shí)現(xiàn)封裝。數(shù)據(jù)庫的最初雛形據(jù)說源自美國一個奶牛場的記賬薄(紙質(zhì)的,由此可見,數(shù)據(jù)庫并不一定是存儲在電腦里的數(shù)據(jù)_),里面記錄的是該奶牛場的收支

2、賬目,程序員在將其整理、錄入到電腦中時從中受到啟發(fā)。當(dāng)按照規(guī)定好的數(shù)據(jù)結(jié)構(gòu)所采集到的數(shù)據(jù)量大到一定程度后,出于程序執(zhí)行效率的考慮,程序員將其中的檢索、更新維護(hù)等功能分離出來,做成單獨(dú)調(diào)用的模塊,這個模塊后來就慢慢發(fā)展、演變成現(xiàn)在我們所接觸到的數(shù)據(jù)庫管理系統(tǒng)(DBMS)程序開發(fā)中的一個重要分支。下面進(jìn)入正題,首先按我個人所接觸過的程序給數(shù)據(jù)庫設(shè)計(jì)人員的功底分一下類:、沒有系統(tǒng)學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的程序員。這類程序員的作品往往只是他們的即興玩具,他們往往習(xí)慣只設(shè)計(jì)有限的幾個表,實(shí)現(xiàn)某類功能的數(shù)據(jù)全部塞在一個表中,各表之間幾乎毫無關(guān)聯(lián)。網(wǎng)上不少的免費(fèi)管理軟件都是這樣的東西,當(dāng)程序功能有限,數(shù)據(jù)量不多的時候

3、,其程序運(yùn)行起來沒有什么問題,但是如果用其管理比較重要的數(shù)據(jù),風(fēng)險性非常大。、系統(tǒng)學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu),但是還沒有開發(fā)過對程序效率要求比較高的管理軟件的程序員。這類人多半剛從學(xué)校畢業(yè)不久,他們在設(shè)計(jì)數(shù)據(jù)庫表結(jié)構(gòu)時,嚴(yán)格按照教科書上的規(guī)定,死扣E-R圖和3NF(別灰心,所有的數(shù)據(jù)庫設(shè)計(jì)高手都是從這一步開始的)。他們的作品,對于一般的access型輕量級的管理軟件,已經(jīng)夠用。但是一旦該系統(tǒng)需要添加新功能,原有的數(shù)據(jù)庫表差不多得進(jìn)行大換血。、第二類程序員,在經(jīng)歷過數(shù)次程序效率的提升,以及功能升級的折騰后,終于升級成為數(shù)據(jù)庫設(shè)計(jì)的老鳥,第一類程序員眼中的高人。這類程序員可以勝任二十個表以上的中型商業(yè)數(shù)據(jù)管理

4、系統(tǒng)的開發(fā)工作。他們知道該在什么樣的情況下保留一定的冗余數(shù)據(jù)來提高程序效率,而且其設(shè)計(jì)的數(shù)據(jù)庫可拓展性較好,當(dāng)用戶需要添加新功能時,原有數(shù)據(jù)庫表只需做少量修改即可。、在經(jīng)歷過上十個類似數(shù)據(jù)庫管理軟件的重復(fù)設(shè)計(jì)后,第三類程序員中堅(jiān)持下來沒有轉(zhuǎn)行,而是希望從中找出“偷懶”竅門的有心人會慢慢覺悟,從而完成量變到質(zhì)變的轉(zhuǎn)換。他們所設(shè)計(jì)的數(shù)據(jù)庫表結(jié)構(gòu)有一定的遠(yuǎn)見,能夠預(yù)測到未來功能升級所需要的數(shù)據(jù),從而預(yù)先留下伏筆。這類程序員目前大多晉級成數(shù)據(jù)挖掘方面的高級軟件開發(fā)人員。、第三類程序員或第四類程序員,在對現(xiàn)有的各家數(shù)據(jù)庫管理系統(tǒng)的原理和開發(fā)都有一定的鉆研后,要么在其基礎(chǔ)上進(jìn)行二次開發(fā),要么自行開發(fā)一套有

5、自主版權(quán)的通用數(shù)據(jù)庫管理系統(tǒng)。我個人正處于第三類的末期,所以下面所列出的一些設(shè)計(jì)技巧只適合第二類和部分第三類數(shù)據(jù)庫設(shè)計(jì)人員。同時,由于我很少碰到有興趣在這方面深鉆下去的同行,所以文中難免出現(xiàn)錯誤和遺漏,在此先行聲明,歡迎大家指正,不要藏私哦8)一樹型關(guān)系的數(shù)據(jù)表不少程序員在進(jìn)行數(shù)據(jù)庫設(shè)計(jì)的時候都遇到過樹型關(guān)系的數(shù)據(jù),例如常見的類別表,即一個大類,下面有若干個子類,某些子類又有子類這樣的情況。當(dāng)類別不確定,用戶希望可以在任意類別下添加新的子類,或者刪除某個類別和其下的所有子類,而且預(yù)計(jì)以后其數(shù)量會逐步增長,此時我們就會考慮用一個數(shù)據(jù)表來保存這些數(shù)據(jù)。按照教科書上的教導(dǎo),第二類程序員大概會設(shè)計(jì)出類

6、似這樣的數(shù)據(jù)表結(jié)構(gòu):類別表_1(Type_table_1)名稱類型約束條件說明type_idint無重復(fù)類別標(biāo)識,主鍵type_namechar(50)不允許為空類型名稱,不允許重復(fù)type_fatherint不允許為空該類別的父類別標(biāo)識,如果是頂節(jié)點(diǎn)的話設(shè)定為某個唯一值這樣的設(shè)計(jì)短小精悍,完全滿足3NF,而且可以滿足用戶的所有要求。是不是這樣就行呢?答案是NO!Why?我們來估計(jì)一下用戶希望如何羅列出這個表的數(shù)據(jù)的。對用戶而言,他當(dāng)然期望按他所設(shè)定的層次關(guān)系一次羅列出所有的類別,例如這樣:總類別類別1類別1.1類別1.1.1類別1.2類別2類別2.1類別3類別3.1類別3.2看看為了實(shí)現(xiàn)這樣

7、的列表顯示(樹的先序遍歷),要對上面的表進(jìn)行多少次檢索?注意,盡管類別可能是在類別3.2之后添加的記錄,答案仍然是N次。這樣的效率對于少量的數(shù)據(jù)沒什么影響,但是日后類型擴(kuò)充到數(shù)十條甚至上百條記錄后,單單列一次類型就要檢索數(shù)十次該表,整個程序的運(yùn)行效率就不敢恭維了?;蛟S第二類程序員會說,那我再建一個臨時數(shù)組或臨時表,專門保存類型表的先序遍歷結(jié)果,這樣只在第一次運(yùn)行時檢索數(shù)十次,再次羅列所有的類型關(guān)系時就直接讀那個臨時數(shù)組或臨時表就行了。其實(shí),用不著再去分配一塊新的內(nèi)存來保存這些數(shù)據(jù),只要對數(shù)據(jù)表進(jìn)行一定的擴(kuò)充,再對添加類型的數(shù)量進(jìn)行一下約束就行了,要完成上面的列表只需一次檢索就行了。下面是擴(kuò)充后

8、的數(shù)據(jù)表結(jié)構(gòu):類別表_2(Type_table_2)名稱類型約束條件說明type_idint無重復(fù)類別標(biāo)識,主鍵type_namechar(50)不允許為空類型名稱,不允許重復(fù)type_fatherint不允許為空該類別的父類別標(biāo)識,如果是頂節(jié)點(diǎn)的話設(shè)定為某個唯一值type_layerchar(6)限定3層,初始值為000000類別的先序遍歷,主要為減少檢索數(shù)據(jù)庫的次數(shù)按照這樣的表結(jié)構(gòu),我們來看看上面例子記錄在表中的數(shù)據(jù)是怎樣的:type_id      type_name      

9、    type_father          type_layer1             總類別               0      &

10、#160;          0000002             類別1                1          

11、       0100003             類別1.1              2               

12、60; 0101004             類別1.2              2                 0102005   

13、0;         類別2                1                 0200006       

14、60;     類別2.1              5                 0201007             

15、類別3                1                 0300008             類別3.1   

16、           7                 0301009             類別3.2        

17、60;     7                 03020010            類別            3    

18、             010101現(xiàn)在按type_layer的大小來檢索一下:SELECT * FROM Type_table_2 ORDER BY type_layer列出記錄集如下:type_id      type_name          type_father     &#

19、160;    type_layer1             總類別               0                 00

20、00002             類別1                1                 0100003   

21、          類別1.1              2                 01010010        &#

22、160;   類別            3                 0101014             類別1.2   

23、60;          2                 0102005             類別2         &#

24、160;      1                 0200006             類別2.1             

25、; 5                 0201007             類別3                1   &#

26、160;             0300008             類別3.1              7         

27、;        0301009             類別3.2              7              &#

28、160;  030200現(xiàn)在列出的記錄順序正好是先序遍歷的結(jié)果。在控制顯示類別的層次時,只要對type_layer字段中的數(shù)值進(jìn)行判斷,每2位一組,如大于0則向右移2個空格。當(dāng)然,我這個例子中設(shè)定的限制條件是最多3層,每層最多可設(shè)99個子類別,只要按用戶的需求情況修改一下type_layer的長度和位數(shù),即可更改限制層數(shù)和子類別數(shù)。其實(shí),上面的設(shè)計(jì)不單單只在類別表中用到,網(wǎng)上某些可按樹型列表顯示的論壇程序大多采用類似的設(shè)計(jì)?;蛟S有人認(rèn)為,Type_table_2中的type_father字段是冗余數(shù)據(jù),可以除去。如果這樣,在插入、刪除某個類別的時候,就得對type_layer

29、0;的內(nèi)容進(jìn)行比較繁瑣的判定,所以我并沒有消去type_father字段,這也正符合數(shù)據(jù)庫設(shè)計(jì)中適當(dāng)保留冗余數(shù)據(jù)的來降低程序復(fù)雜度的原則,后面我會舉一個故意增加數(shù)據(jù)冗余的案例。二、商品信息表的設(shè)計(jì)假設(shè)你是一家百貨公司電腦部的開發(fā)人員,某天老板要求你為公司開發(fā)一套網(wǎng)上電子商務(wù)平臺,該百貨公司有數(shù)千種商品出售,不過目前僅打算先在網(wǎng)上銷售數(shù)十種方便運(yùn)輸?shù)纳唐?,?dāng)然,以后可能會陸續(xù)在該電子商務(wù)平臺上增加新的商品出售?,F(xiàn)在開始進(jìn)行該平臺數(shù)據(jù)庫的商品信息表的設(shè)計(jì)。每種出售的商品都會有相同的屬性,如商品編號,商品名稱,商品所屬類別,相關(guān)信息,供貨廠商,內(nèi)含件數(shù),庫存,進(jìn)貨價,銷售價,優(yōu)惠價。你很快就設(shè)計(jì)出3

30、個表:商品類型表(Wares_type),供貨廠商表(Wares_provider),商品信息表(Wares_info):商品類型表(Wares_type)名稱類型約束條件說明type_idint 無重復(fù)類別標(biāo)識,主鍵type_namechar(50)不允許為空類型名稱,不允許重復(fù)type_fatherint不允許為空該類別的父類別標(biāo)識,如果是頂節(jié)點(diǎn)的話設(shè)定為某個唯一值type_layerchar(6)限定3層,初始值為000000類別的先序遍歷,主要為減少檢索數(shù)據(jù)庫的次數(shù)供貨廠商表(Wares_provider)名稱類型約束條件說明provider_idint無重復(fù)供貨商標(biāo)識,主鍵provi

31、der_namechar(100)不允許為空供貨商名稱商品信息表(Wares_info)名稱類型約束條件說明wares_idint無重復(fù)商品標(biāo)識,主鍵wares_namechar(100)不允許為空商品名稱wares_typeint不允許為空商品類型標(biāo)識,和Wares_type.type_id關(guān)聯(lián)wares_infochar(200)允許為空相關(guān)信息providerint不允許為空供貨廠商標(biāo)識,和Wares_vider_id關(guān)聯(lián)setnumint初始值為1內(nèi)含件數(shù),默認(rèn)為1stockint初始值為0庫存,默認(rèn)為0buy_pricemoney不允許為空進(jìn)貨價sell_pr

32、icemoney不允許為空銷售價discountmoney不允許為空優(yōu)惠價你拿著這3個表給老板檢查,老板希望能夠再添加一個商品圖片的字段,不過只有一部分商品有圖片。OK,你在商品信息表(Wares_info)中增加了一個haspic的BOOL型字段,然后再建了一個新表商品圖片表(Wares_pic):商品圖片表(Wares_pic)名稱類型約束條件說明pic_idint無重復(fù)商品圖片標(biāo)識,主鍵wares_idint不允許為空所屬商品標(biāo)識,和Wares_info.wares_id關(guān)聯(lián)pic_addresschar(200)不允許為空圖片存放路徑程序開發(fā)完成后,完全滿足老板目前的要求,于是正式啟用

33、。一段時間后,老板打算在這套平臺上推出新的商品銷售,其中,某類商品全部都需添加“長度”的屬性。第一輪折騰來了當(dāng)然,你按照添加商品圖片表的老方法,在商品信息表(Wares_info)中增加了一個haslength的BOOL型字段,又建了一個新表商品長度表(Wares_length):商品長度表(Wares_length)名稱類型約束條件說明length_idint無重復(fù)商品圖片標(biāo)識,主鍵wares_idint不允許為空所屬商品標(biāo)識,和Wares_info.wares_id關(guān)聯(lián)lengthchar(20)不允許為空商品長度說明剛剛改完沒多久,老板又打算上一批新的商品,這次某類商品全部需要添加“寬度

34、”的屬性。你咬了咬牙,又照方抓藥,添加了商品寬度表(Wares_width)。又過了一段時間,老板新上的商品中有一些需要添加“高度”的屬性,你是不是開始覺得你所設(shè)計(jì)的數(shù)據(jù)庫按照這種方式增長下去,很快就能變成一個迷宮呢?那么,有沒有什么辦法遏制這種不可預(yù)見性,但卻類似重復(fù)的數(shù)據(jù)庫膨脹呢?我在閱讀敏捷軟件開發(fā):原則、模式與實(shí)踐中發(fā)現(xiàn)作者舉過類似的例子:7.3“Copy”程序。其中,我非常贊同敏捷軟件開發(fā)這個觀點(diǎn):在最初幾乎不進(jìn)行預(yù)先設(shè)計(jì),但是一旦需求發(fā)生變化,此時作為一名追求卓越的程序員,應(yīng)該從頭審查整個架構(gòu)設(shè)計(jì),在此次修改中設(shè)計(jì)出能夠滿足日后類似修改的系統(tǒng)架構(gòu)。下面是我在需要添加“長度”的屬性時

35、所提供的修改方案:去掉商品信息表(Wares_info)中的haspic字段,添加商品額外屬性表(Wares_ex_property)和商品額外信息表(Wares_ex_info)2個表來完成添加新屬性的功能。商品額外屬性表(Wares_ex_property)名稱類型約束條件說明ex_pidint無重復(fù)商品額外屬性標(biāo)識,主鍵p_namechar(20)不允許為空額外屬性名稱商品額外信息表(Wares_ex_info)名稱類型約束條件說明ex_iidint無重復(fù)商品額外信息標(biāo)識,主鍵wares_idint不允許為空所屬商品標(biāo)識,和Wares_info.wares_id關(guān)聯(lián)property_id

36、int不允許為空商品額外屬性標(biāo)識,和Wares_ex_property.ex_pid關(guān)聯(lián)property_valuechar(200)不允許為空商品額外屬性值在商品額外屬性表(Wares_ex_property)中添加2條記錄:ex_pid            p_name1                商品圖片2 

37、;               商品長度再在整個電子商務(wù)平臺的后臺管理功能中追加一項(xiàng)商品額外屬性管理的功能,以后添加新的商品時出現(xiàn)新的屬性,只需利用該功能往商品額外屬性表(Wares_ex_property)中添加一條記錄即可。不要害怕變化,被第一顆子彈擊中并不是壞事,壞的是被相同軌道飛來的第二顆、第三顆子彈擊中。第一顆子彈來得越早,所受的傷越重,之后的抵抗力也越強(qiáng)8)(待續(xù))三、多用戶及其權(quán)限管理的設(shè)計(jì)開發(fā)數(shù)據(jù)庫管理類的軟件,不可能不考慮多用戶

38、和用戶權(quán)限設(shè)置的問題。盡管目前市面上的大、中型的后臺數(shù)據(jù)庫系統(tǒng)軟件都提供了多用戶,以及細(xì)至某個數(shù)據(jù)庫內(nèi)某張表的權(quán)限設(shè)置的功能,我個人建議:一套成熟的數(shù)據(jù)庫管理軟件,還是應(yīng)該自行設(shè)計(jì)用戶管理這塊功能,原因有二:1.那些大、中型后臺數(shù)據(jù)庫系統(tǒng)軟件所提供的多用戶及其權(quán)限設(shè)置都是針對數(shù)據(jù)庫的共有屬性,并不一定能完全滿足某些特例的需求;2.不要過多的依賴后臺數(shù)據(jù)庫系統(tǒng)軟件的某些特殊功能,多種大、中型后臺數(shù)據(jù)庫系統(tǒng)軟件之間并不完全兼容。否則一旦日后需要轉(zhuǎn)換數(shù)據(jù)庫平臺或后臺數(shù)據(jù)庫系統(tǒng)軟件版本升級,之前的架構(gòu)設(shè)計(jì)很可能無法重用。下面看看如何自行設(shè)計(jì)一套比較靈活的多用戶管理模塊,即該數(shù)據(jù)庫管理軟件的系統(tǒng)管理員可

39、以自行添加新用戶,修改已有用戶的權(quán)限,刪除已有用戶。首先,分析用戶需求,列出該數(shù)據(jù)庫管理軟件所有需要實(shí)現(xiàn)的功能;然后,根據(jù)一定的聯(lián)系對這些功能進(jìn)行分類,即把某類用戶需使用的功能歸為一類;最后開始建表:功能表(Function_table)名稱類型約束條件說明f_idint無重復(fù)功能標(biāo)識,主鍵f_namechar(20)不允許為空功能名稱,不允許重復(fù)f_descchar(50)允許為空功能描述用戶組表(User_group)名稱類型約束條件說明group_idint無重復(fù)用戶組標(biāo)識,主鍵group_namechar(20)不允許為空用戶組名稱group_powerchar(100)不允許為空用戶

40、組權(quán)限表,內(nèi)容為功能表f_id的集合用戶表(User_table)名稱類型約束條件說明user_idint無重復(fù)用戶標(biāo)識,主鍵user_namechar(20)無重復(fù)用戶名user_pwdchar(20)不允許為空用戶密碼user_typeint不允許為空所屬用戶組標(biāo)識,和User_group.group_id關(guān)聯(lián)采用這種用戶組的架構(gòu)設(shè)計(jì),當(dāng)需要添加新用戶時,只需指定新用戶所屬的用戶組;當(dāng)以后系統(tǒng)需要添加新功能或?qū)εf有功能權(quán)限進(jìn)行修改時,只用操作功能表和用戶組表的記錄,原有用戶的功能即可相應(yīng)隨之變化。當(dāng)然,這種架構(gòu)設(shè)計(jì)把數(shù)據(jù)庫管理軟件的功能判定移到了前臺,使得前臺開發(fā)相對復(fù)雜一些。但是,當(dāng)用戶

41、數(shù)較大(10人以上),或日后軟件升級的概率較大時,這個代價是值得的。四、簡潔的批量m:n設(shè)計(jì)碰到m:n的關(guān)系,一般都是建立3個表,m一個,n一個,m:n一個。但是,m:n有時會遇到批量處理的情況,例如到圖書館借書,一般都是允許用戶同時借閱n本書,如果要求按批查詢借閱記錄,即列出某個用戶某次借閱的所有書籍,該如何設(shè)計(jì)呢?讓我們先建好必須的3個表:書籍表(Book_table)名稱類型約束條件說明book_idint無重復(fù)書籍標(biāo)識,主鍵book_nochar(20)無重復(fù)書籍編號book_namechar(100)不允許為空書籍名稱借閱用戶表(Renter_table)名稱類型約束條件說明rent

42、er_idint無重復(fù)用戶標(biāo)識,主鍵renter_namechar(20)不允許為空用戶姓名借閱記錄表(Rent_log)名稱類型約束條件說明rent_idint無重復(fù)借閱記錄標(biāo)識,主鍵r_idint不允許為空用戶標(biāo)識,和Renter_table.renter_id關(guān)聯(lián)b_idint不允許為空書籍標(biāo)識,和Book_table.book_id關(guān)聯(lián)rent_datedatetime不允許為空借閱時間為了實(shí)現(xiàn)按批查詢借閱記錄,我們可以再建一個表來保存批量借閱的信息,例如:批量借閱表(Batch_rent)名稱類型約束條件說明batch_idint無重復(fù)批量借閱標(biāo)識,主鍵batch_noint不允許為

43、空批量借閱編號,同一批借閱的batch_no相同rent_idint不允許為空借閱記錄標(biāo)識,和Rent_log.rent_id關(guān)聯(lián)batch_datedatetime不允許為空批量借閱時間這樣的設(shè)計(jì)好嗎?我們來看看為了列出某個用戶某次借閱的所有書籍,需要如何查詢?首先檢索批量借閱表(Batch_rent),把符合條件的的所有記錄的rent_id字段的數(shù)據(jù)保存起來,再用這些數(shù)據(jù)作為查詢條件帶入到借閱記錄表(Rent_log)中去查詢。那么,有沒有什么辦法改進(jìn)呢?下面給出一種簡潔的批量設(shè)計(jì)方案,不需添加新表,只需修改一下借閱記錄表(Rent_log)即可。修改后的記錄表(Rent_log)如下:借

44、閱記錄表(Rent_log)名稱類型約束條件說明rent_idint無重復(fù)借閱記錄標(biāo)識,主鍵r_idint不允許為空用戶標(biāo)識,和Renter_table.renter_id關(guān)聯(lián)b_idint不允許為空書籍標(biāo)識,和Book_table.book_id關(guān)聯(lián)batch_noint不允許為空批量借閱編號,同一批借閱的batch_no相同rent_datedatetime不允許為空借閱時間其中,同一次借閱的batch_no和該批第一條入庫的rent_id相同。舉例:假設(shè)當(dāng)前最大rent_id是64,接著某用戶一次借閱了3本書,則批量插入的3條借閱記錄的batch_no都是65。之后另外一個用戶租了一套碟

45、,再插入出租記錄的rent_id是68。采用這種設(shè)計(jì),查詢批量借閱的信息時,只需使用一條標(biāo)準(zhǔn)T_SQL的嵌套查詢即可。當(dāng)然,這種設(shè)計(jì)不符合3NF,但是和上面標(biāo)準(zhǔn)的3NF設(shè)計(jì)比起來,哪一種更好呢?答案就不用我說了吧。五、冗余數(shù)據(jù)的取舍上篇的“樹型關(guān)系的數(shù)據(jù)表”中保留了一個冗余字段,這里的例子更進(jìn)一步添加了一個冗余表。先看看例子:我原先所在的公司為了解決員工的工作餐,和附近的一家小餐館聯(lián)系,每天吃飯記賬,費(fèi)用按人數(shù)平攤,月底由公司現(xiàn)金結(jié)算,每個人每個月的工作餐費(fèi)從工資中扣除。當(dāng)然,每天吃飯的人員和人數(shù)都不是固定的,而且,由于每頓工作餐的所點(diǎn)的菜色不同,每頓的花費(fèi)也不相同。例如,星期一中餐5人花費(fèi)40元,晚餐2人花費(fèi)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論