數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ)

此頁(yè)沒(méi)有內(nèi)容條目
內(nèi)容

Access > Access 基礎(chǔ)知識(shí)

 

數(shù)據(jù)庫(kù)設(shè)計(jì)基礎(chǔ)

設(shè)計(jì)合理的數(shù)據(jù)庫(kù)可以讓您訪(fǎng)問(wèn)最新的、準(zhǔn)確的信息。由于正確的設(shè)計(jì)對(duì)于實(shí)現(xiàn)使用數(shù)據(jù)庫(kù)的目標(biāo)非常重要,因此有必要投入時(shí)間學(xué)習(xí)良好設(shè)計(jì)的相關(guān)原則。這樣,最終就更有可能獲得一個(gè)既能滿(mǎn)足您的需要又能輕松適應(yīng)變化的數(shù)據(jù)庫(kù)。

本文提供了規(guī)劃桌面數(shù)據(jù)庫(kù)的一些原則。您將了解到如何確定需要哪些信息,如何將這些信息劃分到相應(yīng)的表和列,以及這些表如何彼此關(guān)聯(lián)。在創(chuàng)建第一個(gè)桌面數(shù)據(jù)庫(kù)之前,首先應(yīng)閱讀本文。

要點(diǎn)  Microsoft Access 2010 提供了新的設(shè)計(jì)體驗(yàn),可讓您為網(wǎng)站創(chuàng)建數(shù)據(jù)庫(kù)應(yīng)用程序。在為網(wǎng)站設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),有很多不同的設(shè)計(jì)注意事項(xiàng)。本文不討論 Web 數(shù)據(jù)庫(kù)應(yīng)用程序設(shè)計(jì)。有關(guān)詳細(xì)信息,請(qǐng)參閱生成可在 WEB 上共享的數(shù)據(jù)庫(kù)一文。

本文內(nèi)容


hrefIcon_ZA10069439 需要了解的一些數(shù)據(jù)庫(kù)術(shù)語(yǔ)

hrefIcon_ZA10069439 什么是好的數(shù)據(jù)庫(kù)設(shè)計(jì)?

hrefIcon_ZA10069439 設(shè)計(jì)過(guò)程

hrefIcon_ZA10069439 確定數(shù)據(jù)庫(kù)的用途

hrefIcon_ZA10069439 查找和組織所需的信息

hrefIcon_ZA10069439 將信息劃分到表中

hrefIcon_ZA10069439 將信息項(xiàng)轉(zhuǎn)換為列

hrefIcon_ZA10069439 指定主鍵

hrefIcon_ZA10069439 創(chuàng)建表關(guān)系

hrefIcon_ZA10069439 優(yōu)化設(shè)計(jì)

hrefIcon_ZA10069439 應(yīng)用規(guī)范化規(guī)則


 

需要了解的一些數(shù)據(jù)庫(kù)術(shù)語(yǔ)

Access 2010 可將信息組織到中, 表是由行和列組成的列表,與會(huì)計(jì)人員的便箋簿或電子表格類(lèi)似。在簡(jiǎn)單的數(shù)據(jù)庫(kù)中,可能僅包含一個(gè)表。對(duì)于大多數(shù)數(shù)據(jù)庫(kù),可能需要多個(gè)表。例如,可以在一個(gè)表中存儲(chǔ)有關(guān)產(chǎn)品的信息,在另一個(gè)表中存儲(chǔ)有關(guān)訂單的信息,再在另一個(gè)表中存儲(chǔ)有關(guān)客戶(hù)的信息。

TP_CPUC]{A1G~JXAAZ0979V

按照更為準(zhǔn)確的說(shuō)法,每一行稱(chēng)為“記錄”,而每一列稱(chēng)為“字段”。記錄是一種用來(lái)組合某事項(xiàng)的相關(guān)信息的有效且一致的方法。字段是單個(gè)信息項(xiàng),即出現(xiàn)在每條記錄中的項(xiàng)類(lèi)型。  例如,在“產(chǎn)品”表中,每一行或記錄中都會(huì)包含與某個(gè)產(chǎn)品相關(guān)的信息。每一列或字段則包含有關(guān)該產(chǎn)品的某種類(lèi)型的信息,如名稱(chēng)或價(jià)格。

TopPageIcon_CLV 返回頁(yè)首

什么是好的數(shù)據(jù)庫(kù)設(shè)計(jì)?

一些原則可為數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程提供指導(dǎo)。第一個(gè)原則是,重復(fù)信息(也稱(chēng)為冗余數(shù)據(jù))很糟糕,因?yàn)橹貜?fù)信息會(huì)浪費(fèi)空間,并會(huì)增加出錯(cuò)和不一致的可能性。第二個(gè)原則是,信息的正確性和完整性非常重要。如果數(shù)據(jù)庫(kù)中包含不正確的信息,任何從數(shù)據(jù)庫(kù)中提取信息的報(bào)表也將包含不正確的信息。因此,基于這些報(bào)表所做的任何決策都將提供錯(cuò)誤信息。

所以,良好的數(shù)據(jù)庫(kù)設(shè)計(jì)應(yīng)該是這樣的:

將信息劃分到基于主題的表中,以減少冗余數(shù)據(jù)。
向 Access 提供根據(jù)需要聯(lián)接表中信息時(shí)所需的信息。
可幫助支持和確保信息的準(zhǔn)確性和完整性。
可滿(mǎn)足數(shù)據(jù)處理和報(bào)表需求。

TopPageIcon_CLV 返回頁(yè)首

設(shè)計(jì)過(guò)程

設(shè)計(jì)過(guò)程包括以下步驟:

確定數(shù)據(jù)庫(kù)的用途

這可幫助進(jìn)行其他步驟的準(zhǔn)備工作。

查找和組織所需的信息

收集可能希望在數(shù)據(jù)庫(kù)中記錄的各種信息,如產(chǎn)品名稱(chēng)和訂單號(hào)。

將信息劃分到表中

將信息項(xiàng)劃分到主要的實(shí)體或主題中,如“產(chǎn)品”或“訂單”。每個(gè)主題即構(gòu)成一個(gè)表。

將信息項(xiàng)轉(zhuǎn)換為列

確定希望在每個(gè)表中存儲(chǔ)哪些信息。每個(gè)項(xiàng)將成為一個(gè)字段,并作為列顯示在表中。例如,“雇員”表中可能包含“姓氏”和“聘用日期”等字段。

指定主鍵

選擇每個(gè)表的主鍵。主鍵是一個(gè)用于唯一標(biāo)識(shí)每個(gè)行的列。例如,主鍵可以為“產(chǎn)品 ID”或“訂單 ID”。

建立表關(guān)系

查看每個(gè)表,并確定各個(gè)表中的數(shù)據(jù)如何彼此關(guān)聯(lián)。根據(jù)需要,將字段添加到表中或創(chuàng)建新表,以便清楚地表達(dá)這些關(guān)系。

優(yōu)化設(shè)計(jì)

分析設(shè)計(jì)中是否存在錯(cuò)誤。創(chuàng)建表并添加幾條示例數(shù)據(jù)記錄。確定是否可以從表中獲得期望的結(jié)果。根據(jù)需要對(duì)設(shè)計(jì)進(jìn)行調(diào)整。

應(yīng)用規(guī)范化規(guī)則

應(yīng)用數(shù)據(jù)規(guī)范化規(guī)則,以確定表的結(jié)構(gòu)是否正確。根據(jù)需要對(duì)表進(jìn)行調(diào)整。

TopPageIcon_CLV 返回頁(yè)首

確定數(shù)據(jù)庫(kù)的用途

最好將數(shù)據(jù)庫(kù)的用途記錄在紙上,包括數(shù)據(jù)庫(kù)的用途、預(yù)期使用方式及使用者。  例如,對(duì)于供家庭辦公用戶(hù)使用的小型數(shù)據(jù)庫(kù),可以記錄與“客戶(hù)數(shù)據(jù)庫(kù)保存客戶(hù)信息列表,用于生成郵件和報(bào)表”類(lèi)似的簡(jiǎn)單內(nèi)容。如果數(shù)據(jù)庫(kù)比較復(fù)雜或者由很多人使用(在企業(yè)環(huán)境中通常是這樣),數(shù)據(jù)庫(kù)的用途可以簡(jiǎn)單地分為一段或多段描述性?xún)?nèi)容,且應(yīng)包含每個(gè)人將在何時(shí)及以何種方式使用數(shù)據(jù)庫(kù)。這種做法的目的是為了獲得一個(gè)良好的任務(wù)說(shuō)明,作為整個(gè)設(shè)計(jì)過(guò)程的參考。任務(wù)說(shuō)明可以幫助您在進(jìn)行決策時(shí)將重點(diǎn)集中在目標(biāo)上。

TopPageIcon_CLV 返回頁(yè)首

查找和組織所需的信息

要查找和組織所需信息,請(qǐng)從現(xiàn)有信息著手。例如,您可能會(huì)將采購(gòu)訂單記錄在分類(lèi)帳中,或?qū)⒖蛻?hù)信息保存在文件柜中的某個(gè)紙質(zhì)表單中。收集這些文檔,并列出所顯示的每種信息(例如在表單中填寫(xiě)的每個(gè)框)。如果沒(méi)有任何現(xiàn)有表單,則請(qǐng)?jiān)O(shè)想您必須設(shè)計(jì)一個(gè)表單來(lái)記錄客戶(hù)信息。將要在表單中存放哪些信息?將要?jiǎng)?chuàng)建哪些填充框?確定并列出其中的每一項(xiàng)。例如,假定當(dāng)前在索引卡上記錄客戶(hù)列表。這些卡片上可能記錄了客戶(hù)姓名、地址、城市、省/市/自治區(qū)、郵政編碼和電話(huà)號(hào)碼。其中的每一項(xiàng)都可能表示表中的一個(gè)列。

在準(zhǔn)備此列表時(shí),不要為讓它在最開(kāi)始就能達(dá)到完美的效果而擔(dān)憂(yōu)。相反,請(qǐng)列出每個(gè)想到的項(xiàng)。如果還有其他人使用該數(shù)據(jù)庫(kù),也應(yīng)向他們征求意見(jiàn)??稍谝院髮?duì)該列表進(jìn)行優(yōu)化。

接下來(lái),考慮可能希望從數(shù)據(jù)庫(kù)生成的報(bào)表或郵件的類(lèi)型。例如,可能會(huì)希望生成按照區(qū)域顯示銷(xiāo)售量的產(chǎn)品銷(xiāo)售報(bào)表,或生成顯示庫(kù)存水平的庫(kù)存匯總報(bào)表。還可能希望生成發(fā)送給客戶(hù)、用來(lái)通告銷(xiāo)售活動(dòng)或提供優(yōu)惠的套用信函。在心中設(shè)計(jì)此類(lèi)報(bào)表,并想象其外觀。將在報(bào)表中放置哪些信息?列出每一項(xiàng)。對(duì)希望創(chuàng)建的套用信函和任何其他報(bào)表進(jìn)行相同的工作。

正在設(shè)想產(chǎn)品庫(kù)存報(bào)表的人員

考慮可能希望創(chuàng)建的報(bào)表和郵件,可以幫助確定數(shù)據(jù)庫(kù)中將需要的各個(gè)項(xiàng)。例如,假定向客戶(hù)提供選擇訂閱(或取消訂閱)周期性電子郵件更新的機(jī)會(huì),且希望打印已經(jīng)選擇訂閱的客戶(hù)的列表。為了記錄該信息,向客戶(hù)表中添加了一個(gè)“發(fā)送電子郵件”列。對(duì)于每個(gè)客戶(hù),可以將此字段設(shè)置為“是”或“否”。

向客戶(hù)發(fā)送電子郵件的要求還意味著要記錄另一個(gè)項(xiàng)。知道客戶(hù)希望接收電子郵件后,還需要知道這些電子郵件的接收地址。因此,需要記錄每個(gè)客戶(hù)的電子郵件地址。

有一種很好的做法:為每個(gè)報(bào)表或輸出列表構(gòu)造一個(gè)原型,并考慮需要哪些項(xiàng)才能生成該報(bào)表。例如,檢查套用信函時(shí),可能會(huì)想到一些事項(xiàng)。如果希望包括恰當(dāng)?shù)姆Q(chēng)呼語(yǔ)(如作為問(wèn)候語(yǔ)開(kāi)頭的“先生”、“太太”或 “女士”等字符串), 則需要?jiǎng)?chuàng)建一個(gè)稱(chēng)呼語(yǔ)項(xiàng)。另外,通??赡懿捎谩白鹁吹耐跸壬倍皇恰白鹁吹耐跛济飨壬?作為信件的開(kāi)頭。這表示一般要將姓和名分開(kāi)存儲(chǔ)。

需要記住的要點(diǎn)是,應(yīng)該將每條信息分為最小的有用單元。對(duì)于姓名,為了讓姓氏易于使用,需要將姓名分為兩部分:名字和姓氏。例如,為了按照姓氏對(duì)報(bào)表進(jìn)行排序,將客戶(hù)的姓氏分開(kāi)存儲(chǔ)將很有幫助。一般情況下,如果希望根據(jù)信息項(xiàng)進(jìn)行排序、搜索、計(jì)算或生成報(bào)表,應(yīng)當(dāng)將該項(xiàng)放置在單獨(dú)的字段中。

考慮希望數(shù)據(jù)庫(kù)進(jìn)行回答的問(wèn)題。例如,上個(gè)月您的特色產(chǎn)品的銷(xiāo)售量是多少?您的主要客戶(hù)在什么地方?您的暢銷(xiāo)產(chǎn)品的供應(yīng)商是誰(shuí)?對(duì)這些問(wèn)題進(jìn)行估計(jì),可以幫助您將精力集中于需要記錄的其他項(xiàng)。

收集這些信息后,就可以進(jìn)行下面的步驟。

TopPageIcon_CLV 返回頁(yè)首

將信息劃分到表中

要將信息劃分到表中,請(qǐng)選擇主要實(shí)體或主題。例如,在查找和組織用于產(chǎn)品銷(xiāo)售數(shù)據(jù)庫(kù)的信息后,初步列表可能與下圖類(lèi)似:

劃分為若干主題的手寫(xiě)信息項(xiàng)

此處所示的主要實(shí)體為產(chǎn)品、供應(yīng)商、客戶(hù)和訂單。因此,可以從以下四個(gè)表開(kāi)始:一個(gè)用來(lái)存儲(chǔ)有關(guān)產(chǎn)品的真實(shí)信息、一個(gè)用來(lái)存儲(chǔ)有關(guān)供應(yīng)商的真實(shí)信息、一個(gè)用來(lái)存儲(chǔ)有關(guān)客戶(hù)的真實(shí)信息、一個(gè)用來(lái)存儲(chǔ)有關(guān)訂單的真實(shí)信息。盡管這樣并沒(méi)有完成列表,但卻是一個(gè)不錯(cuò)的起點(diǎn)??梢岳^續(xù)對(duì)此列表進(jìn)行優(yōu)化,直到獲得適用的設(shè)計(jì)為止。

首次檢查項(xiàng)的初步列表時(shí),可能非常想將所有項(xiàng)全部放入一個(gè)表中,而不是放入上圖中顯示的四個(gè)表中。您將在此處了解到為什么這樣做不好??紤]一下此處所示的表:

顯示同時(shí)包含產(chǎn)品和供應(yīng)商的表的圖像

在這種情況下,每行中同時(shí)包含有關(guān)產(chǎn)品及其供應(yīng)商的信息。由于可能擁有來(lái)自同一供應(yīng)商的許多產(chǎn)品,因此供應(yīng)商的名稱(chēng)和地址信息不得不多次重復(fù)。這就浪費(fèi)了磁盤(pán)空間。在單獨(dú)的“供應(yīng)商”表中僅記錄一次供應(yīng)商信息,然后將該表鏈接到“產(chǎn)品”表,是更好的解決方案。

此設(shè)計(jì)的另一個(gè)問(wèn)題出現(xiàn)在需要修改有關(guān)供應(yīng)商的信息時(shí)。例如,假定需要更改供應(yīng)商的地址。由于此信息出現(xiàn)在多個(gè)位置,您可能會(huì)意外地更改了一個(gè)位置的地址而忘記更改其他位置的地址信息。將供應(yīng)商的地址記錄在唯一一個(gè)位置就可以解決該問(wèn)題。

設(shè)計(jì)數(shù)據(jù)庫(kù)時(shí),應(yīng)始終盡可能僅記錄每個(gè)事實(shí)一次。如果發(fā)現(xiàn)自己在多個(gè)位置重復(fù)相同的信息(如特定供應(yīng)商的地址),則請(qǐng)將該信息放入單獨(dú)的表中。

最后,假定只有 Coho Winery 提供的一個(gè)產(chǎn)品,并且您想刪除該產(chǎn)品但仍保留供應(yīng)商名稱(chēng)和地址信息。如何在不丟失供應(yīng)商信息的前提下刪除產(chǎn)品記錄呢?您無(wú)法做到這一點(diǎn)。因?yàn)槊織l記錄中既包含有關(guān)產(chǎn)品的事實(shí),也包含有關(guān)供應(yīng)商的事實(shí),無(wú)法刪除一個(gè)事實(shí)而保留另一個(gè)事實(shí)。為了分開(kāi)保存這些事實(shí),必須將一個(gè)表拆分為兩個(gè)表:一個(gè)表存儲(chǔ)產(chǎn)品信息,另一個(gè)表存儲(chǔ)供應(yīng)商信息。刪除產(chǎn)品記錄應(yīng)僅刪除有關(guān)產(chǎn)品的事實(shí),而不會(huì)刪除有關(guān)供應(yīng)商的事實(shí)。

選擇了用表來(lái)表示的主題后,該表中的列就應(yīng)僅存儲(chǔ)有關(guān)該主題的事實(shí)。例如,產(chǎn)品表應(yīng)僅存儲(chǔ)有關(guān)產(chǎn)品的事實(shí)。由于供應(yīng)商地址是有關(guān)供應(yīng)商的事實(shí),而不是有關(guān)產(chǎn)品的事實(shí),因此屬于供應(yīng)商表。

TopPageIcon_CLV 返回頁(yè)首

將信息項(xiàng)轉(zhuǎn)換為列

要確定表中的列,請(qǐng)確定需要跟蹤表中所記錄主題的哪些信息。例如,對(duì)于“客戶(hù)”表,“姓名”、“地址”、“市-省/自治區(qū)-郵編”、“發(fā)送電子郵件”、“稱(chēng)呼”和“電子郵件地址”就是不錯(cuò)的列初始列表。表中的每條記錄包含同一組列,因此,可以為每條記錄存儲(chǔ)“姓名”、“地址”、“市-省/自治區(qū)-郵編”、“發(fā)送電子郵件”、“稱(chēng)呼”和“電子郵件地址”。例如,“地址”列包含客戶(hù)的地址。每條記錄包含有關(guān)一位客戶(hù)的數(shù)據(jù),而“地址”字段包含該客戶(hù)的地址。

為每個(gè)表確定了初始的一組列后,可以對(duì)列進(jìn)行進(jìn)一步優(yōu)化。例如,將客戶(hù)姓名作為兩個(gè)單獨(dú)的列存儲(chǔ)是有用的:即“名字”和“姓氏”,以便僅在這些列上進(jìn)行排序、搜索和索引操作。類(lèi)似地,地址實(shí)際上包含五個(gè)獨(dú)立的組成部分:地址、城市、省/市/自治區(qū)、郵政編碼和國(guó)家/地區(qū),也可以將這些信息存儲(chǔ)在單獨(dú)的列中。例如,如果希望按照省/市/自治區(qū)執(zhí)行搜索、篩選或排序操作,則需要將省/市/自治區(qū)信息存儲(chǔ)在單獨(dú)的列中。

還應(yīng)該考慮數(shù)據(jù)庫(kù)是僅存儲(chǔ)國(guó)內(nèi)的信息,還是也要存儲(chǔ)國(guó)際信息。例如,如果打算存儲(chǔ)國(guó)際地址,則最好使用“地區(qū)”列代替“省/市/自治區(qū)”列,因?yàn)檫@樣的列既可能存儲(chǔ)國(guó)內(nèi)的省/市/自治區(qū),也可能存儲(chǔ)屬于其他國(guó)家/地區(qū)的地區(qū)。同樣,如果要存儲(chǔ)國(guó)際地址,則采用 Postal Code 比使用 Zip Code 更有用。

下面的列表顯示了用于確定列的一些提示。

不要包含已計(jì)算的數(shù)據(jù)

大多數(shù)情況下,不應(yīng)在表中存儲(chǔ)計(jì)算結(jié)果。在希望查看相應(yīng)結(jié)果時(shí),可以讓 Access 執(zhí)行計(jì)算。例如,假如有一個(gè)“已訂購(gòu)產(chǎn)品”報(bào)表,該報(bào)表顯示數(shù)據(jù)庫(kù)中每類(lèi)產(chǎn)品的已訂購(gòu)數(shù)量的分類(lèi)匯總。不過(guò),在所有表中都沒(méi)有“已訂購(gòu)數(shù)量”分類(lèi)匯總列。相反,“產(chǎn)品”表中包含存儲(chǔ)每種產(chǎn)品的已訂購(gòu)數(shù)量的“已訂購(gòu)數(shù)量”列。通過(guò)使用該數(shù)據(jù),Access 可以在每次打印報(bào)表時(shí)計(jì)算相應(yīng)的分類(lèi)匯總。而分類(lèi)匯總本身不應(yīng)存儲(chǔ)在表中。

將信息按照其最小的邏輯單元進(jìn)行存儲(chǔ)

您可能非常想使用單個(gè)字段存儲(chǔ)全名,或使用單個(gè)字段存儲(chǔ)產(chǎn)品名稱(chēng)和產(chǎn)品說(shuō)明。如果將一種以上信息存儲(chǔ)在一個(gè)字段中,則在以后要檢索單個(gè)事實(shí)就會(huì)很困難。請(qǐng)嘗試將信息拆分為多個(gè)邏輯單元,例如,為姓氏和名字或?yàn)楫a(chǎn)品名稱(chēng)、類(lèi)別和說(shuō)明創(chuàng)建單獨(dú)的字段。

設(shè)計(jì)過(guò)程中信息項(xiàng)的列表

對(duì)每個(gè)表中的數(shù)據(jù)列進(jìn)行優(yōu)化后,就可以選擇每個(gè)表的主鍵了。

TopPageIcon_CLV 返回頁(yè)首

指定主鍵

每個(gè)表應(yīng)包含一個(gè)列或一組列,用于對(duì)存儲(chǔ)在該表中的每個(gè)行進(jìn)行唯一標(biāo)識(shí)。這通常是一個(gè)唯一的標(biāo)識(shí)號(hào),如雇員 ID 號(hào)或序列號(hào)。在數(shù)據(jù)庫(kù)術(shù)語(yǔ)中,此信息稱(chēng)為表的主鍵。Access 使用主鍵字段將多個(gè)表中的數(shù)據(jù)關(guān)聯(lián)起來(lái),從而將數(shù)據(jù)組合在一起。

如果已經(jīng)為表指定了唯一標(biāo)識(shí)符(如唯一標(biāo)識(shí)目錄中的每種產(chǎn)品的產(chǎn)品編號(hào)),就可以使用該標(biāo)識(shí)符作為表的主鍵,但僅當(dāng)此列的值對(duì)每條記錄而言始終不同時(shí)才能如此。主鍵中不能有重復(fù)的值。例如,不要使用人名作為主鍵,因?yàn)樾彰皇俏ㄒ坏摹:苋菀自谕粋€(gè)表中出現(xiàn)兩個(gè)同名的人。

主鍵必須始終具有值。如果某列的值可以在某個(gè)時(shí)間變成未分配或未知(缺少值),則該值不能作為主鍵的組成部分。

應(yīng)該始終選擇其值不會(huì)更改的主鍵。在使用多個(gè)表的數(shù)據(jù)庫(kù)中,可將一個(gè)表的主鍵作為引用在其他表中使用。如果主鍵發(fā)生更改,還必須將此更改應(yīng)用到其他任何引用該鍵的位置。使用不會(huì)更改的主鍵可降低出現(xiàn)主鍵與其他引用該鍵的表不同步的幾率。

通常將任意唯一數(shù)字作為主鍵使用。例如,可能會(huì)為每個(gè)訂單分配一個(gè)唯一的訂單號(hào)。訂單號(hào)的唯一用途是對(duì)訂單進(jìn)行標(biāo)識(shí)。分配后,訂單號(hào)就永遠(yuǎn)都不更改。

如果尚未確定可能成為好的主鍵的一個(gè)或一組列,請(qǐng)考慮使用具有“自動(dòng)編號(hào)”數(shù)據(jù)類(lèi)型的列。使用“自動(dòng)編號(hào)”數(shù)據(jù)類(lèi)型時(shí),Access 將自動(dòng)為您分配一個(gè)值。這樣的標(biāo)識(shí)符不包含事實(shí)數(shù)據(jù),即不包含描述它所表示的行的事實(shí)信息。不包含事實(shí)數(shù)據(jù)的標(biāo)識(shí)符非常適合作為主鍵使用,因?yàn)樗鼈儾粫?huì)更改。包含有關(guān)某一行的事實(shí)數(shù)據(jù)的主鍵(如電話(huà)號(hào)碼或客戶(hù)名稱(chēng))很有可能會(huì)改變,因?yàn)槭聦?shí)信息本身可能會(huì)更改。


顯示具有主鍵字段的“產(chǎn)品”表的圖像

標(biāo)注 1 設(shè)置為“自動(dòng)編號(hào)”數(shù)據(jù)類(lèi)型的列通常是很好的主鍵。任何兩個(gè)產(chǎn)品 ID 都是不同的。


在某些情況下,您可能想使用兩個(gè)或多個(gè)字段一起作為表的主鍵。例如,存儲(chǔ)訂單行項(xiàng)目的“訂單細(xì)節(jié)”表將在其主鍵中使用兩個(gè)列:“訂單 ID”和“產(chǎn)品 ID”。當(dāng)一個(gè)主鍵使用多個(gè)列時(shí),它又被稱(chēng)為復(fù)合鍵。

對(duì)于產(chǎn)品銷(xiāo)售數(shù)據(jù)庫(kù),可以為每個(gè)表創(chuàng)建一個(gè)自動(dòng)編號(hào)列作為主鍵使用:為“產(chǎn)品”表創(chuàng)建“產(chǎn)品 ID”、為“訂單”表創(chuàng)建“訂單 ID”、為“客戶(hù)”表創(chuàng)建“客戶(hù) ID”、為“供應(yīng)商”表創(chuàng)建“供應(yīng)商 ID”。

顯示設(shè)計(jì)過(guò)程中的信息項(xiàng)的圖像

 

TopPageIcon_CLV 返回頁(yè)首

創(chuàng)建表關(guān)系

既然已經(jīng)將信息劃分到各表中,接下來(lái)需要一種方法,以有意義的方式再次將信息組織到一起。例如,下面的窗體包含來(lái)自幾個(gè)表的信息。


“訂單”窗體

標(biāo)注 1 此窗體中的信息來(lái)自“客戶(hù)”表……

標(biāo)注 2 ……“雇員”表……

標(biāo)注 3 ……“訂單”表……

標(biāo)注 4 ……“產(chǎn)品”表……

標(biāo)注 5 ……和“訂單明細(xì)”表。


Access 是關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)。在關(guān)系數(shù)據(jù)庫(kù)中,您將信息劃分到基于主題的不同表中。然后使用表關(guān)系根據(jù)需要將信息組合在一起。

TopPageIcon_CLV 返回頁(yè)首

創(chuàng)建一對(duì)多關(guān)系

請(qǐng)考慮下面的示例:產(chǎn)品訂單數(shù)據(jù)庫(kù)中的“供應(yīng)商”和“產(chǎn)品”表。供應(yīng)商可以提供任意數(shù)量的產(chǎn)品?!肮?yīng)商”表中表示的任何供應(yīng)商都是這樣,“產(chǎn)品”表中可以表示很多產(chǎn)品。因此,“供應(yīng)商”表和“產(chǎn)品”表之間的關(guān)系就是一對(duì)多關(guān)系。

一對(duì)多的概念

為了在數(shù)據(jù)庫(kù)設(shè)計(jì)中表示一對(duì)多關(guān)系,請(qǐng)獲取關(guān)系“一”方的主鍵,并將其作為附加的一列或多列添加到關(guān)系“多”方的表中。例如在本例中,將“供應(yīng)商”表中的“供應(yīng)商 ID”列添加到“產(chǎn)品”表中。Access 可以隨后使用“產(chǎn)品”表中的供應(yīng)商 ID 號(hào)來(lái)查找每個(gè)產(chǎn)品的正確供應(yīng)商。

“產(chǎn)品”表中的“供應(yīng)商 ID”列稱(chēng)為外鍵。外鍵是另一個(gè)表的主鍵?!爱a(chǎn)品”表中的“供應(yīng)商 ID”列之所以是外鍵,是因?yàn)樗彩恰肮?yīng)商”表中的主鍵。

設(shè)計(jì)過(guò)程中信息項(xiàng)的列表

通過(guò)建立主鍵和外鍵的配對(duì)提供了聯(lián)接相關(guān)表的基礎(chǔ)。如果不確定哪些表應(yīng)該共享一個(gè)公共列,通過(guò)確定一對(duì)多關(guān)系,就可以確保涉及的兩個(gè)表的確需要一個(gè)共享列。

TopPageIcon_CLV 返回頁(yè)首

創(chuàng)建多對(duì)多關(guān)系

考慮一下“產(chǎn)品”表和“訂單”表之間的關(guān)系。

單個(gè)訂單中可以包含多個(gè)產(chǎn)品。另一方面,一個(gè)產(chǎn)品可能出現(xiàn)在多個(gè)訂單中。因此,對(duì)于“訂單”表中的每條記錄,都可能與“產(chǎn)品”表中的多條記錄對(duì)應(yīng)。同樣,對(duì)于“產(chǎn)品”表中的每條記錄,都可能與“訂單”表中的多條記錄對(duì)應(yīng)。這種關(guān)系稱(chēng)為多對(duì)多關(guān)系,因?yàn)閷?duì)于任何產(chǎn)品,都可能有多個(gè)訂單,而對(duì)于任何訂單,都可能包含許多產(chǎn)品。請(qǐng)注意,為了檢測(cè)到表之間的多對(duì)多關(guān)系,務(wù)必要同時(shí)對(duì)關(guān)系的雙方進(jìn)行考慮。

兩個(gè)表的主題(即訂單和產(chǎn)品)具有多對(duì)多關(guān)系, 這就帶來(lái)了一個(gè)問(wèn)題。為了理解這個(gè)問(wèn)題,請(qǐng)想像一下,如果試圖向“訂單”表添加“產(chǎn)品 ID”字段來(lái)創(chuàng)建兩個(gè)表之間的關(guān)系,會(huì)發(fā)生什么情況。為了讓每個(gè)訂單包含多個(gè)產(chǎn)品,則需要在“訂單”表中為每個(gè)訂單添加多條記錄。與單個(gè)訂單相關(guān)的每個(gè)行將重復(fù)使用相同的訂單信息,從而產(chǎn)生可能導(dǎo)致數(shù)據(jù)不準(zhǔn)確的低效設(shè)計(jì)。如果在“產(chǎn)品”表中放置“訂單 ID”字段,也會(huì)遇到相同的問(wèn)題,即在“產(chǎn)品”表中每個(gè)產(chǎn)品將有多條記錄與之對(duì)應(yīng)。如何解決此問(wèn)題呢?

答案是創(chuàng)建第三個(gè)表(通常稱(chēng)為聯(lián)接表),該表將多對(duì)多關(guān)系分為兩個(gè)一對(duì)多關(guān)系。將這兩個(gè)表的主鍵都插入到第三個(gè)表中。因此,第三個(gè)表記錄關(guān)系的每個(gè)匹配項(xiàng)或?qū)嵗?/span>

多對(duì)多關(guān)系

“訂單明細(xì)”表中的每條記錄都代表訂單上的一個(gè)行項(xiàng)目?!坝唵蚊骷?xì)”表的主鍵包含兩個(gè)字段,即“訂單”表和“產(chǎn)品”表的外鍵。僅使用“訂單 ID”字段作為此表的主鍵將不起作用,因?yàn)橐粋€(gè)訂單可能具有多個(gè)行項(xiàng)目?!坝唵?ID”對(duì)訂單上的每個(gè)行項(xiàng)目都會(huì)重復(fù),因此該字段并不包含唯一的值。僅使用“產(chǎn)品 ID”字段作為主鍵也不起作用,因?yàn)橐粋€(gè)產(chǎn)品可能會(huì)出現(xiàn)在多個(gè)不同的訂單中。但如果這兩個(gè)字段聯(lián)合起來(lái),就始終都能為每條記錄生成一個(gè)唯一值。

在產(chǎn)品銷(xiāo)售數(shù)據(jù)庫(kù)中,“訂單”表和“產(chǎn)品”表并不直接彼此關(guān)聯(lián)。它們是通過(guò)“訂單細(xì)節(jié)”表間接關(guān)聯(lián)的。訂單和產(chǎn)品之間的多對(duì)多關(guān)系是通過(guò)使用兩個(gè)一對(duì)多關(guān)系在數(shù)據(jù)庫(kù)中得到表示的:

“訂單”表和“訂單細(xì)節(jié)”表具有一對(duì)多關(guān)系。每個(gè)訂單可以具有多個(gè)行項(xiàng)目,而每個(gè)行項(xiàng)目?jī)H與一個(gè)訂單相關(guān)。
“產(chǎn)品”表和“訂單細(xì)節(jié)”表具有一對(duì)多關(guān)系。每個(gè)產(chǎn)品有多個(gè)與之關(guān)聯(lián)的行項(xiàng)目,而每個(gè)行項(xiàng)目?jī)H引用一個(gè)產(chǎn)品。

通過(guò)“訂單細(xì)節(jié)”表,可以確定特定訂單中的所有產(chǎn)品。還可以確定特定產(chǎn)品的所有訂單。

引入了“訂單細(xì)節(jié)”表后,表和字段列表可能與以下所示類(lèi)似:

設(shè)計(jì)過(guò)程中信息項(xiàng)的列表

 

TopPageIcon_CLV 返回頁(yè)首

創(chuàng)建一對(duì)一關(guān)系

另一種關(guān)系類(lèi)型是一對(duì)一關(guān)系。例如,假定需要記錄某種特別的補(bǔ)充產(chǎn)品信息,此類(lèi)信息很少需要使用或僅適用于少數(shù)產(chǎn)品。由于并不經(jīng)常需要此信息,并且在“產(chǎn)品”表中存儲(chǔ)此信息會(huì)導(dǎo)致不適用此信息的每個(gè)產(chǎn)品出現(xiàn)空白,因此請(qǐng)將此類(lèi)信息放入單獨(dú)的表中。和“產(chǎn)品”表一樣,可以使用“產(chǎn)品 ID”作為主鍵。此補(bǔ)充表和“產(chǎn)品”表之間是一對(duì)一的關(guān)系。對(duì)于“產(chǎn)品”表中的每條記錄,在補(bǔ)充表中都存在單一的匹配記錄。標(biāo)識(shí)此類(lèi)關(guān)系時(shí),這兩個(gè)表必須共享一個(gè)公共字段。

檢測(cè)到數(shù)據(jù)庫(kù)中對(duì)一對(duì)一關(guān)系的需求時(shí),請(qǐng)考慮是否可以將兩個(gè)表中的信息放入一個(gè)表中。如果由于某種原因而不希望這樣做,或許是因?yàn)檫@樣會(huì)造成大量空白字段,下面的列表顯示如何在設(shè)計(jì)中表示這種關(guān)系:

如果兩個(gè)表具有相同主題,則可以通過(guò)在兩個(gè)表中使用相同的主鍵來(lái)建立這種關(guān)系。
如果兩個(gè)表具有不同的主題和不同的主鍵,則請(qǐng)選擇一個(gè)表(任意一個(gè)表),并將其主鍵作為外鍵插入到另一個(gè)表中。

通過(guò)確定表之間的關(guān)系,可幫助確保具有正確的表和列。當(dāng)存在一對(duì)一或一對(duì)多關(guān)系時(shí),所涉及的表需要共享一個(gè)或多個(gè)列。當(dāng)存在多對(duì)多關(guān)系時(shí),需要使用第三個(gè)表來(lái)表示該關(guān)系。

TopPageIcon_CLV 返回頁(yè)首

優(yōu)化設(shè)計(jì)

確定所需的表、字段和關(guān)系后,就應(yīng)創(chuàng)建表并使用示例數(shù)據(jù)來(lái)填充表, 然后嘗試通過(guò)創(chuàng)建查詢(xún)、添加新記錄等操作來(lái)使用這些信息。這些操作可幫助發(fā)現(xiàn)潛在的問(wèn)題,例如,可能需要添加在設(shè)計(jì)階段忘記插入的列,或者可能需要將一個(gè)表拆分為兩個(gè)表以消除重復(fù)。

確定是否可以使用數(shù)據(jù)庫(kù)獲得所期望的答案。創(chuàng)建窗體和報(bào)表的粗略草稿,檢查這些窗體和報(bào)表是否顯示所期望的數(shù)據(jù)。查找不必要的數(shù)據(jù)重復(fù),找到后對(duì)設(shè)計(jì)進(jìn)行更改,以消除這種數(shù)據(jù)重復(fù)。

在測(cè)試初始數(shù)據(jù)庫(kù)時(shí),可能會(huì)發(fā)現(xiàn)可改進(jìn)之處。以下是要檢查的事項(xiàng):

是否忘記了任何列?如果是的話(huà),該信息是否屬于現(xiàn)有的表?如果是有關(guān)其他主題的信息,則可能需要?jiǎng)?chuàng)建另一個(gè)表, 并為需要跟蹤的每個(gè)信息項(xiàng)創(chuàng)建一列。如果無(wú)法通過(guò)其他列計(jì)算出信息,則可能需要為其創(chuàng)建一個(gè)新列。
是否存在可通過(guò)現(xiàn)有字段計(jì)算得到的不必要的列?如果某信息項(xiàng)可以從其他現(xiàn)有列計(jì)算得出(例如通過(guò)零售價(jià)計(jì)算出的折扣價(jià)),則進(jìn)行計(jì)算通常會(huì)更好,并能夠避免創(chuàng)建新列。
是否在某個(gè)表中重復(fù)輸入相同的信息?如果是的話(huà),則可能需要將這個(gè)表拆分為兩個(gè)具有一對(duì)多關(guān)系的表。
是否存在這樣的表:具有很多字段,但記錄數(shù)量有限,且各個(gè)記錄中有很多空字段?如果有的話(huà),則要考慮對(duì)該表進(jìn)行重新設(shè)計(jì),使其包含更少的字段和更多的記錄。
每個(gè)信息項(xiàng)是否已拆分為最小的有用單元?如果需要對(duì)某個(gè)信息項(xiàng)進(jìn)行報(bào)告、排序、搜索或計(jì)算,則請(qǐng)將該項(xiàng)放入其自己的列中。
每一列是否包含有關(guān)所屬表的主題的事實(shí)?如果某一列不滿(mǎn)足此條件,則該列屬于其他表。
表之間的所有關(guān)系是否已經(jīng)都由公共字段或第三個(gè)表加以表示?一對(duì)一和一對(duì)多關(guān)系要求使用公共列, 而多對(duì)多關(guān)系要求使用第三個(gè)表來(lái)表示。

優(yōu)化“產(chǎn)品”表

假定產(chǎn)品銷(xiāo)售數(shù)據(jù)庫(kù)中的每個(gè)產(chǎn)品都?xì)w屬于一個(gè)大類(lèi)別,如飲料、調(diào)味品或海產(chǎn)品。“產(chǎn)品”表可以包含顯示每個(gè)產(chǎn)品所屬類(lèi)別的字段。

假定檢查并優(yōu)化數(shù)據(jù)庫(kù)設(shè)計(jì)后,您決定存儲(chǔ)類(lèi)別說(shuō)明及其名稱(chēng)。如果向“產(chǎn)品”表添加“類(lèi)別說(shuō)明”字段,則必須對(duì)屬于相應(yīng)類(lèi)別的每個(gè)產(chǎn)品重復(fù)使用其類(lèi)別說(shuō)明,但這并不是一個(gè)好的解決方法。

更好的方法是讓“類(lèi)別”成為數(shù)據(jù)庫(kù)中要跟蹤的新主題,使其具有自己的表和主鍵。然后可以將“類(lèi)別”表的主鍵作為外鍵添加到“產(chǎn)品”表中。

“類(lèi)別”和“產(chǎn)品”表具有一對(duì)多關(guān)系:一個(gè)類(lèi)別可以包含多個(gè)產(chǎn)品,但一個(gè)產(chǎn)品只能屬于一個(gè)類(lèi)別。

復(fù)查表結(jié)構(gòu)時(shí),要密切注意重復(fù)的組。例如,考慮一下包含以下列的表:

產(chǎn)品 ID
名稱(chēng)
產(chǎn)品 ID1
名稱(chēng)1
產(chǎn)品 ID2
名稱(chēng)2
產(chǎn)品 ID3
名稱(chēng)3

其中每個(gè)產(chǎn)品都是重復(fù)的列組,只通過(guò)向列名的末尾添加一個(gè)數(shù)字加以區(qū)別??吹揭赃@種方式進(jìn)行編號(hào)的列時(shí),應(yīng)重新對(duì)設(shè)計(jì)進(jìn)行檢查。

此類(lèi)設(shè)計(jì)有幾個(gè)缺點(diǎn)。首先,這將強(qiáng)制對(duì)產(chǎn)品的數(shù)量施加一個(gè)上限。超過(guò)了這個(gè)上限后,就必須向表結(jié)構(gòu)中添加一組新列,而這是一項(xiàng)主要的管理任務(wù)。

另一個(gè)問(wèn)題是,對(duì)于那些擁有的產(chǎn)品數(shù)量少于產(chǎn)品的最大數(shù)量的供應(yīng)商,將浪費(fèi)一定的空間,因?yàn)槠渌袑榭铡4祟?lèi)設(shè)計(jì)最嚴(yán)重的缺陷在于,它使得很多任務(wù)都難以執(zhí)行,例如按照產(chǎn)品 ID 或名稱(chēng)對(duì)表進(jìn)行排序或索引。

只要看到重復(fù)組,就應(yīng)該仔細(xì)地對(duì)設(shè)計(jì)進(jìn)行復(fù)查,以期將該表拆分為兩個(gè)表。在上面的示例中,使用兩個(gè)表會(huì)更好,一個(gè)存儲(chǔ)供應(yīng)商信息,另一個(gè)存儲(chǔ)產(chǎn)品信息,通過(guò)供應(yīng)商 ID 進(jìn)行鏈接。

TopPageIcon_CLV 返回頁(yè)首

應(yīng)用規(guī)范化規(guī)則

接下來(lái)可以在設(shè)計(jì)中應(yīng)用數(shù)據(jù)規(guī)范化規(guī)則(有時(shí)候直接稱(chēng)為規(guī)范化規(guī)則)。可以使用這些規(guī)則來(lái)確定表的結(jié)構(gòu)設(shè)計(jì)是否正確。將這些規(guī)則應(yīng)用到數(shù)據(jù)庫(kù)設(shè)計(jì)的過(guò)程稱(chēng)為數(shù)據(jù)庫(kù)規(guī)范化,或直接稱(chēng)為規(guī)范化。

在表示了所有信息項(xiàng)并完成了初步設(shè)計(jì)時(shí),規(guī)范化過(guò)程最有用。它將幫助確保已經(jīng)將信息項(xiàng)劃分到恰當(dāng)?shù)谋碇?。?guī)范化無(wú)法確保一開(kāi)始就擁有所有的正確數(shù)據(jù)項(xiàng)。

需要在每個(gè)步驟中持續(xù)應(yīng)用這些規(guī)則,以確保設(shè)計(jì)達(dá)到“范式”要求。廣泛接受的范式有五個(gè):第一范式到第五范式。本文將對(duì)前面三個(gè)范式展開(kāi)討論,因?yàn)榇蟛糠謹(jǐn)?shù)據(jù)庫(kù)設(shè)計(jì)都要求使用這三個(gè)范式。

第一范式

第一范式規(guī)定,表中每個(gè)行和列的交叉處只存在一個(gè)值,而決不是值的列表。例如,不能在一個(gè)名為“價(jià)格”的字段中放置多個(gè)“價(jià)格”。如果將行與列的每個(gè)交叉點(diǎn)看作一個(gè)單元格,則每個(gè)單元格中只能包含一個(gè)值。

第二范式

第二范式要求每個(gè)非鍵列完全依賴(lài)于整個(gè)主鍵,而不僅僅依賴(lài)于主鍵的一部分。當(dāng)主鍵由多個(gè)列組成時(shí),就適用此規(guī)則。例如,假定有包含以下列的表,其中“訂單 ID”和“產(chǎn)品 ID”構(gòu)成主鍵:

訂單 ID(主鍵)
產(chǎn)品 ID(主鍵)
產(chǎn)品名稱(chēng)

此設(shè)計(jì)違反了第二范式,因?yàn)椤爱a(chǎn)品名稱(chēng)”依賴(lài)于“產(chǎn)品 ID”,但并不依賴(lài)于“訂單 ID”,因此并不依賴(lài)于整個(gè)主鍵。必須將“產(chǎn)品名稱(chēng)”從表中刪除。它屬于不同的表,即屬于“產(chǎn)品”表。

第三范式

第三范式要求不僅每個(gè)非鍵列依賴(lài)于整個(gè)主鍵,且非鍵列要互相獨(dú)立。

另一種說(shuō)法就是,每個(gè)非鍵列必須且只能依賴(lài)于主鍵。例如,假定有包含以下列的表:

產(chǎn)品 ID(主鍵)
名稱(chēng)
SRP
折扣

假定“折扣”依賴(lài)于建議零售價(jià) (SRP)。此表就違反了第三范式,因?yàn)榉擎I列“折扣”依賴(lài)于另一個(gè)非鍵列 SRP。列獨(dú)立性表示應(yīng)該可以在不影響任何其他列的情況下更改任何非鍵列。如果更改了 SRP 字段中的值,“折扣”將相應(yīng)地發(fā)生改變,這樣就違反了該規(guī)則。在本例中,“折扣”應(yīng)該移到另一個(gè)以 SRP 為主鍵的表中。

TopPageIcon_CLV 返回頁(yè)首