數(shù)據(jù)庫(kù)設(shè)計(jì)5步驟
1.確定entities及relationships
a)設(shè)計(jì)宏觀行為。你用此數(shù)據(jù)庫(kù)來(lái)做什么?比如,希望管理雇員的信息。
b)確定entities。對(duì)于一系列的行為,確定所管理信息所涉及到的主題范圍。這將變成table。比如,雇用員工,指定具體部門,確定技能等級(jí)。
c)確定relationships。看著行為,確定tables之間有何種關(guān)系。比如,在部門與雇員之間存在一種關(guān)系。給這種關(guān)系命名。
d)細(xì)化行為。你從宏觀行為開始,現(xiàn)在仔細(xì)檢查這些行為,看有哪些行為能轉(zhuǎn)為微觀行為。比如,管理雇員的信息可細(xì)化為:
● 增加新員工
● 修改存在員工信息
● 刪除調(diào)走的員工
e)確定業(yè)務(wù)規(guī)則。看著你的業(yè)務(wù)規(guī)則,確定你要采取哪種。比如,可能有這樣一種規(guī)則,一個(gè)部門有且只能有一個(gè)部門領(lǐng)導(dǎo)。這些規(guī)則將被設(shè)計(jì)到數(shù)據(jù)庫(kù)的結(jié)構(gòu)中。
范例:
ACME是一個(gè)小公司,在5個(gè)地方都設(shè)有辦事處。當(dāng)前,有75名員工。公司準(zhǔn)備快速擴(kuò)大規(guī)模,劃分了9個(gè)部門,每個(gè)部門都有其領(lǐng)導(dǎo)。
為有助于尋求新的員工,人事部門規(guī)劃了68種技能,為將來(lái)人事管理作好準(zhǔn)備。員工被招進(jìn)時(shí),每一種技能的專業(yè)等級(jí)都被確定。
定義宏觀行為
一些ACME公司的宏觀行為包括:
● 招聘員工
● 解雇員工
● 管理員工個(gè)人信息
● 管理公司所需的技能信息
● 管理哪位員工有哪些技能
● 管理部門信息
● 管理辦事處信息
確定entities及relationships
我們可以確定要存放信息的主題領(lǐng)域(表)及其關(guān)系,并創(chuàng)建一個(gè)基于宏觀行為及描述的圖表。
我們用方框來(lái)代表table,用菱形代表relationship。我們可以確定哪些relationship是一對(duì)多,一對(duì)一,及多對(duì)多。
這是一個(gè)E-R草圖,以后會(huì)細(xì)化。

細(xì)化宏觀行為
以下微觀行為基于上面宏觀行為而形成:
● 增加或刪除一個(gè)員工
● 增加或刪除一個(gè)辦事處
● 列出一個(gè)部門中的所有員工
● 增加一項(xiàng)技能
● 增加一個(gè)員工的一項(xiàng)技能
● 確定一個(gè)員工的技能
● 確定一個(gè)員工每項(xiàng)技能的等級(jí)
● 確定所有擁有相同等級(jí)的某項(xiàng)技能的員工
● 修改員工的技能等級(jí)
這些微觀行為可用來(lái)確定需要哪些table或relationship。
確定業(yè)務(wù)規(guī)則
業(yè)務(wù)規(guī)則常用于確定一對(duì)多,一對(duì)一,及多對(duì)多關(guān)系。
相關(guān)的業(yè)務(wù)規(guī)則可能有:
● 現(xiàn)在有5個(gè)辦事處;最多允許擴(kuò)展到10個(gè)。
● 員工可以改變部門或辦事處
● 每個(gè)部門有一個(gè)部門領(lǐng)導(dǎo)
● 每個(gè)辦事處至多有3個(gè)電話號(hào)碼
● 每個(gè)電話號(hào)碼有一個(gè)或多個(gè)擴(kuò)展
● 員工被招進(jìn)時(shí),每一種技能的專業(yè)等級(jí)都被確定。
● 每位員工擁有3到20個(gè)技能
● 某位員工可能被安排在一個(gè)辦事處,也可能不安排辦事處。
2.確定所需數(shù)據(jù)
要確定所需數(shù)據(jù):
1. 確定支持?jǐn)?shù)據(jù)
2. 列出所要跟蹤的所有數(shù)據(jù)。描述table(主題)的數(shù)據(jù)回答這些問(wèn)題:誰(shuí),什么,哪里,何時(shí),以及為什么
3. 為每個(gè)table建立數(shù)據(jù)
4. 列出每個(gè)table目前看起來(lái)合適的可用數(shù)據(jù)
5. 為每個(gè)relationship設(shè)置數(shù)據(jù)
6. 如果有,為每個(gè)relationship列出適用的數(shù)據(jù)
確定支持?jǐn)?shù)據(jù)
你所確定的支持?jǐn)?shù)據(jù)將會(huì)成為table中的字段名。比如,下列數(shù)據(jù)將適用于表Employee,表Skill,表Expert In。

如果將這些數(shù)據(jù)畫成圖表,就像:
需要注意:
● 在確定支持?jǐn)?shù)據(jù)時(shí),請(qǐng)一定要參考你之前所確定的宏觀行為,以清楚如何利用這些數(shù)據(jù)。
● 比如,如果你知道你需要所有員工的按姓氏排序的列表,確保你將支持?jǐn)?shù)據(jù)分解為名字與姓氏,這比簡(jiǎn)單地提供一個(gè)名字會(huì)更好。
● 你所選擇的名稱最好保持一致性。這將更易于維護(hù)數(shù)據(jù)庫(kù),也更易于閱讀所輸出的報(bào)表。
● 比如,如果你在某些地方用了一個(gè)縮寫名稱Emp_status,你就不應(yīng)該在另外一個(gè)地方使用全名(Empolyee_ID)。相反,這些名稱應(yīng)當(dāng)是Emp_status及Emp_id。
● 數(shù)據(jù)是否與正確的table相對(duì)應(yīng)無(wú)關(guān)緊要,你可以根據(jù)自己的喜好來(lái)定。在下節(jié)中,你會(huì)通過(guò)測(cè)試對(duì)此作出判斷。
3.標(biāo)準(zhǔn)化數(shù)據(jù)
標(biāo)準(zhǔn)化是你用以消除數(shù)據(jù)冗余及確保數(shù)據(jù)與正確的table或relationship相關(guān)聯(lián)的一系列測(cè)試。共有5個(gè)測(cè)試。本節(jié)中,我們將討論經(jīng)常使用的3個(gè)。
關(guān)于標(biāo)準(zhǔn)化測(cè)試的更多信息,請(qǐng)參考有關(guān)數(shù)據(jù)庫(kù)設(shè)計(jì)的書籍。
標(biāo)準(zhǔn)化格式
標(biāo)準(zhǔn)化格式是標(biāo)準(zhǔn)化數(shù)據(jù)的常用測(cè)試方式。你的數(shù)據(jù)通過(guò)第一遍測(cè)試后,就被認(rèn)為是達(dá)到第一標(biāo)準(zhǔn)化格式;通過(guò)第二遍測(cè)試,達(dá)到第二標(biāo)準(zhǔn)化格式;通過(guò)第三遍測(cè)試,達(dá)到第三標(biāo)準(zhǔn)化格式。
如何標(biāo)準(zhǔn)格式:
1. 列出數(shù)據(jù)
2. 為每個(gè)表確定至少一個(gè)鍵。每個(gè)表必須有一個(gè)主鍵。
3. 確定relationships的鍵。relationships的鍵是連接兩個(gè)表的鍵。
4. 檢查支持?jǐn)?shù)據(jù)列表中的計(jì)算數(shù)據(jù)。計(jì)算數(shù)據(jù)通常不保存在數(shù)據(jù)庫(kù)中。
5. 將數(shù)據(jù)放在第一遍的標(biāo)準(zhǔn)化格式中:
6. 從tables及relationships除去重復(fù)的數(shù)據(jù)。
7. 以你所除去數(shù)據(jù)創(chuàng)建一個(gè)或更多的tables及relationships。
8. 將數(shù)據(jù)放在第二遍的標(biāo)準(zhǔn)化格式中:
9. 用多于一個(gè)以上的鍵確定tables及relationships。
10. 除去只依賴于鍵一部分的數(shù)據(jù)。
11. 以你所除去數(shù)據(jù)創(chuàng)建一個(gè)或更多的tables及relationships。
12. 將數(shù)據(jù)放在第三遍的標(biāo)準(zhǔn)化格式中:
13. 除去那些依賴于tables或relationships中其他數(shù)據(jù),并且不是鍵的數(shù)據(jù)。
14. 以你所除去數(shù)據(jù)創(chuàng)建一個(gè)或更多的tables及relationships。
數(shù)據(jù)與鍵
在你開始標(biāo)準(zhǔn)化(測(cè)試數(shù)據(jù))前,簡(jiǎn)單地列出數(shù)據(jù),并為每張表確定一個(gè)唯一的主鍵。這個(gè)鍵可以由一個(gè)字段或幾個(gè)字段(連鎖鍵)組成。
主鍵是一張表中唯一區(qū)分各行的一組字段。Employee表的主鍵是Employee ID字段。Works In relationship中的主鍵包括Office Code及Employee ID字段。給數(shù)據(jù)庫(kù)中每一relationship給出一個(gè)鍵,從其所連接的每一個(gè)table中抽取其鍵產(chǎn)生。

將數(shù)據(jù)放在第一遍的標(biāo)準(zhǔn)化格式中
● 除去重復(fù)的組
● 要測(cè)試第一遍標(biāo)準(zhǔn)化格式,除去重復(fù)的組,并將它們放進(jìn)他們各自的一張表中。
● 在下面的例子中,Phone Number可以重復(fù)。(一個(gè)工作人員可以有多于一個(gè)的電話號(hào)碼。)將重復(fù)的組除去,創(chuàng)建一個(gè)名為Telephone的新表。在Telephone與Office創(chuàng)建一個(gè)名為Associated With的relationship。
將數(shù)據(jù)放在第二遍的標(biāo)準(zhǔn)化格式中
● 除去那些不依賴于整個(gè)鍵的數(shù)據(jù)。
● 只看那些有一個(gè)以上鍵的tables及relationships。要測(cè)試第二遍標(biāo)準(zhǔn)化格式,除去那些不依賴于整個(gè)鍵的任何數(shù)據(jù)(組成鍵的所有字段)。
● 在此例中,原Employee表有一個(gè)由兩個(gè)字段組成的鍵。一些數(shù)據(jù)不依賴于整個(gè)鍵;例如,department name只依賴于其中一個(gè)鍵(Department ID)。因此,Department ID,其他Employee數(shù)據(jù)并不依賴于它,應(yīng)移至一個(gè)名為Department的新表中,并為Employee及Department建立一個(gè)名為Assigned To的relationship。

將數(shù)據(jù)放在第三遍的標(biāo)準(zhǔn)化格式中
● 除去那些不直接依賴于鍵的數(shù)據(jù)。
● 要測(cè)試第三遍標(biāo)準(zhǔn)化格式,除去那些不是直接依賴于鍵,而是依賴于其他數(shù)據(jù)的數(shù)據(jù)。
● 在此例中,原Employee表有依賴于其鍵(Employee ID)的數(shù)據(jù)。然而,office location及office phone依賴于其他字段,即Office Code。它們不直接依賴于Employee ID鍵。將這組數(shù)據(jù),包括Office Code,移至一個(gè)名為Office的新表中,并為Employee及Office建立一個(gè)名為Works In的relationship。

4.考量關(guān)系
當(dāng)你完成標(biāo)準(zhǔn)化進(jìn)程后,你的設(shè)計(jì)已經(jīng)差不多完成了。你所需要做的,就是考量關(guān)系。
考量帶有數(shù)據(jù)的關(guān)系
你的一些relationship可能集含有數(shù)據(jù)。這經(jīng)常發(fā)生在多對(duì)多的關(guān)系中。

遇到這種情況,將relationship轉(zhuǎn)化為一個(gè)table。relationship的鍵依舊成為table中的鍵。
考量沒(méi)有數(shù)據(jù)的關(guān)系
要實(shí)現(xiàn)沒(méi)有數(shù)據(jù)的關(guān)系,你需要定義外部鍵。外部鍵是含有另外一個(gè)表中主鍵的一個(gè)或多個(gè)字段。外部鍵使你能同時(shí)連接多表數(shù)據(jù)。
有一些基本原則能幫助你決定將這些鍵放在哪里:
一對(duì)多 在一對(duì)多關(guān)系中,“一”中的主鍵放在“多”中。此例中,外部鍵放在Employee表中。
一對(duì)一 在一對(duì)一關(guān)系中,外部鍵可以放進(jìn)任一表中。如果必須要放在某一邊,而不能放在另一邊,應(yīng)該放在必須的一邊。此例中,外部鍵(Head ID)在Department表中,因?yàn)檫@是必需的。

多對(duì)多 在多對(duì)多關(guān)系中,用兩個(gè)外部鍵來(lái)創(chuàng)建一個(gè)新表。已存的舊表通過(guò)這個(gè)新表來(lái)發(fā)生聯(lián)系。

5.檢驗(yàn)設(shè)計(jì)
在你完成設(shè)計(jì)之前,你需要確保它滿足你的需要。檢查你在一開始時(shí)所定義的行為,確認(rèn)你可以獲取行為所需要的所有數(shù)據(jù):
● 你能找到一個(gè)路徑來(lái)等到你所需要的所有信息嗎?
● 設(shè)計(jì)是否滿足了你的需要?
● 所有需要的數(shù)據(jù)都可用嗎?
如果你對(duì)以上的問(wèn)題都回答是,你已經(jīng)差不多完成設(shè)計(jì)了。
最終設(shè)計(jì)
最終設(shè)計(jì)看起來(lái)就像這樣:

設(shè)計(jì)數(shù)據(jù)庫(kù)的表屬性
數(shù)據(jù)庫(kù)設(shè)計(jì)需要確定有什么表,每張表有什么字段。此節(jié)討論如何指定各字段的屬性。
對(duì)于每一字段,你必須決定字段名,數(shù)據(jù)類型及大小,是否允許NULL值,以及你是否希望數(shù)據(jù)庫(kù)限制字段中所允許的值。
選擇字段名
字段名可以是字母、數(shù)字或符號(hào)的任意組合。然而,如果字段名包括了字母、數(shù)字或下劃線、或并不以字母打頭,或者它是個(gè)關(guān)鍵字(詳見關(guān)鍵字表),那么當(dāng)使用字段名稱時(shí),必須用雙引號(hào)括起來(lái)。
為字段選擇數(shù)據(jù)類型
SQL Anywhere支持的數(shù)據(jù)類型包括:
整數(shù)(int, integer, smallint)
小數(shù)(decimal, numeric)
浮點(diǎn)數(shù)(float, double)
字符型(char, varchar, long varchar)
二進(jìn)制數(shù)據(jù)類型(binary, long binary)
日期/時(shí)間類型(date, time, timestamp)
用戶自定義類型
關(guān)于數(shù)據(jù)類型的內(nèi)容,請(qǐng)參見“SQL Anywhere數(shù)據(jù)類型”一節(jié)。字段的數(shù)據(jù)類型影響字段的最大尺寸。例如,如果你指定SMALLINT,此字段可以容納32,767的整數(shù)。INTEGER可以容納2,147,483,647的整數(shù)。對(duì)CHAR來(lái)講,字段的最大值必須指定。
長(zhǎng)二進(jìn)制的數(shù)據(jù)類型可用來(lái)在數(shù)據(jù)庫(kù)中保存例如圖像(如位圖)或者文字編輯文檔。這些類型的信息通常被稱為二進(jìn)制大型對(duì)象,或者BLOBS。
關(guān)于每一數(shù)據(jù)類型的完整描述,見“SQL Anywhere數(shù)據(jù)類型”。
NULL與NOT NULL
如果一個(gè)字段值是必填的,你就將此字段定義為NOT NULL。否則,字段值可以為NULL值,即可以有空值。SQL中的默認(rèn)值是允許空值;你應(yīng)該顯示地將字段定義為NOT NULL,除非你有好理由將其設(shè)為允許空值。
關(guān)于NULL值的完整描述,請(qǐng)見“NULL value”。有關(guān)其對(duì)比用法,見“Search conditions”。
選擇約束
盡管字段的數(shù)據(jù)類型限制了能存在字段中的數(shù)據(jù)(例如,只能存數(shù)字或日期),你或許希望更進(jìn)一步來(lái)約束其允許值。
你可以通過(guò)指定一個(gè)“CHECK”約束來(lái)限制任意字段的值。你可以使用能在WHERE子句中出現(xiàn)的任何有效條件來(lái)約束被允許的值,盡管大多數(shù)CHECK約束使用BETWEEN或IN條件。
更多信息
有關(guān)有效條件的更多信息,見“Search conditions”。有關(guān)如何為表及字段指定約束,見“Ensuring Data Integrity”。
例子
例子數(shù)據(jù)庫(kù)中有一個(gè)名為department的表,字段是dept_id, dept_name, dept_head_id。其定義如下:

注意每一字段都被指定為“not null”。這種情況下,表中每一記錄的所有字段的數(shù)據(jù)都必填。
選擇主鍵及外部鍵
主鍵是唯一識(shí)別表中每一項(xiàng)記錄的字段。如何你的表已經(jīng)正確標(biāo)準(zhǔn)化,主鍵應(yīng)當(dāng)成為數(shù)據(jù)庫(kù)設(shè)計(jì)的一部分。
外部鍵是包含另一表中主鍵值的一個(gè)或一組字段。外部鍵關(guān)系在數(shù)據(jù)庫(kù)中建立了一對(duì)一及一對(duì)多關(guān)系。如果你的設(shè)計(jì)已經(jīng)正確標(biāo)準(zhǔn)化,外部鍵應(yīng)當(dāng)成為數(shù)據(jù)庫(kù)設(shè)計(jì)的一部分。
1.確定entities及relationships
a)設(shè)計(jì)宏觀行為。你用此數(shù)據(jù)庫(kù)來(lái)做什么?比如,希望管理雇員的信息。
b)確定entities。對(duì)于一系列的行為,確定所管理信息所涉及到的主題范圍。這將變成table。比如,雇用員工,指定具體部門,確定技能等級(jí)。
c)確定relationships。看著行為,確定tables之間有何種關(guān)系。比如,在部門與雇員之間存在一種關(guān)系。給這種關(guān)系命名。
d)細(xì)化行為。你從宏觀行為開始,現(xiàn)在仔細(xì)檢查這些行為,看有哪些行為能轉(zhuǎn)為微觀行為。比如,管理雇員的信息可細(xì)化為:
● 增加新員工
● 修改存在員工信息
● 刪除調(diào)走的員工
e)確定業(yè)務(wù)規(guī)則。看著你的業(yè)務(wù)規(guī)則,確定你要采取哪種。比如,可能有這樣一種規(guī)則,一個(gè)部門有且只能有一個(gè)部門領(lǐng)導(dǎo)。這些規(guī)則將被設(shè)計(jì)到數(shù)據(jù)庫(kù)的結(jié)構(gòu)中。
范例:
ACME是一個(gè)小公司,在5個(gè)地方都設(shè)有辦事處。當(dāng)前,有75名員工。公司準(zhǔn)備快速擴(kuò)大規(guī)模,劃分了9個(gè)部門,每個(gè)部門都有其領(lǐng)導(dǎo)。
為有助于尋求新的員工,人事部門規(guī)劃了68種技能,為將來(lái)人事管理作好準(zhǔn)備。員工被招進(jìn)時(shí),每一種技能的專業(yè)等級(jí)都被確定。
定義宏觀行為
一些ACME公司的宏觀行為包括:
● 招聘員工
● 解雇員工
● 管理員工個(gè)人信息
● 管理公司所需的技能信息
● 管理哪位員工有哪些技能
● 管理部門信息
● 管理辦事處信息
確定entities及relationships
我們可以確定要存放信息的主題領(lǐng)域(表)及其關(guān)系,并創(chuàng)建一個(gè)基于宏觀行為及描述的圖表。
我們用方框來(lái)代表table,用菱形代表relationship。我們可以確定哪些relationship是一對(duì)多,一對(duì)一,及多對(duì)多。
這是一個(gè)E-R草圖,以后會(huì)細(xì)化。

細(xì)化宏觀行為
以下微觀行為基于上面宏觀行為而形成:
● 增加或刪除一個(gè)員工
● 增加或刪除一個(gè)辦事處
● 列出一個(gè)部門中的所有員工
● 增加一項(xiàng)技能
● 增加一個(gè)員工的一項(xiàng)技能
● 確定一個(gè)員工的技能
● 確定一個(gè)員工每項(xiàng)技能的等級(jí)
● 確定所有擁有相同等級(jí)的某項(xiàng)技能的員工
● 修改員工的技能等級(jí)
這些微觀行為可用來(lái)確定需要哪些table或relationship。
確定業(yè)務(wù)規(guī)則
業(yè)務(wù)規(guī)則常用于確定一對(duì)多,一對(duì)一,及多對(duì)多關(guān)系。
相關(guān)的業(yè)務(wù)規(guī)則可能有:
● 現(xiàn)在有5個(gè)辦事處;最多允許擴(kuò)展到10個(gè)。
● 員工可以改變部門或辦事處
● 每個(gè)部門有一個(gè)部門領(lǐng)導(dǎo)
● 每個(gè)辦事處至多有3個(gè)電話號(hào)碼
● 每個(gè)電話號(hào)碼有一個(gè)或多個(gè)擴(kuò)展
● 員工被招進(jìn)時(shí),每一種技能的專業(yè)等級(jí)都被確定。
● 每位員工擁有3到20個(gè)技能
● 某位員工可能被安排在一個(gè)辦事處,也可能不安排辦事處。
2.確定所需數(shù)據(jù)
要確定所需數(shù)據(jù):
1. 確定支持?jǐn)?shù)據(jù)
2. 列出所要跟蹤的所有數(shù)據(jù)。描述table(主題)的數(shù)據(jù)回答這些問(wèn)題:誰(shuí),什么,哪里,何時(shí),以及為什么
3. 為每個(gè)table建立數(shù)據(jù)
4. 列出每個(gè)table目前看起來(lái)合適的可用數(shù)據(jù)
5. 為每個(gè)relationship設(shè)置數(shù)據(jù)
6. 如果有,為每個(gè)relationship列出適用的數(shù)據(jù)
確定支持?jǐn)?shù)據(jù)
你所確定的支持?jǐn)?shù)據(jù)將會(huì)成為table中的字段名。比如,下列數(shù)據(jù)將適用于表Employee,表Skill,表Expert In。

如果將這些數(shù)據(jù)畫成圖表,就像:

需要注意:
● 在確定支持?jǐn)?shù)據(jù)時(shí),請(qǐng)一定要參考你之前所確定的宏觀行為,以清楚如何利用這些數(shù)據(jù)。
● 比如,如果你知道你需要所有員工的按姓氏排序的列表,確保你將支持?jǐn)?shù)據(jù)分解為名字與姓氏,這比簡(jiǎn)單地提供一個(gè)名字會(huì)更好。
● 你所選擇的名稱最好保持一致性。這將更易于維護(hù)數(shù)據(jù)庫(kù),也更易于閱讀所輸出的報(bào)表。
● 比如,如果你在某些地方用了一個(gè)縮寫名稱Emp_status,你就不應(yīng)該在另外一個(gè)地方使用全名(Empolyee_ID)。相反,這些名稱應(yīng)當(dāng)是Emp_status及Emp_id。
● 數(shù)據(jù)是否與正確的table相對(duì)應(yīng)無(wú)關(guān)緊要,你可以根據(jù)自己的喜好來(lái)定。在下節(jié)中,你會(huì)通過(guò)測(cè)試對(duì)此作出判斷。
3.標(biāo)準(zhǔn)化數(shù)據(jù)
標(biāo)準(zhǔn)化是你用以消除數(shù)據(jù)冗余及確保數(shù)據(jù)與正確的table或relationship相關(guān)聯(lián)的一系列測(cè)試。共有5個(gè)測(cè)試。本節(jié)中,我們將討論經(jīng)常使用的3個(gè)。
關(guān)于標(biāo)準(zhǔn)化測(cè)試的更多信息,請(qǐng)參考有關(guān)數(shù)據(jù)庫(kù)設(shè)計(jì)的書籍。
標(biāo)準(zhǔn)化格式
標(biāo)準(zhǔn)化格式是標(biāo)準(zhǔn)化數(shù)據(jù)的常用測(cè)試方式。你的數(shù)據(jù)通過(guò)第一遍測(cè)試后,就被認(rèn)為是達(dá)到第一標(biāo)準(zhǔn)化格式;通過(guò)第二遍測(cè)試,達(dá)到第二標(biāo)準(zhǔn)化格式;通過(guò)第三遍測(cè)試,達(dá)到第三標(biāo)準(zhǔn)化格式。
如何標(biāo)準(zhǔn)格式:
1. 列出數(shù)據(jù)
2. 為每個(gè)表確定至少一個(gè)鍵。每個(gè)表必須有一個(gè)主鍵。
3. 確定relationships的鍵。relationships的鍵是連接兩個(gè)表的鍵。
4. 檢查支持?jǐn)?shù)據(jù)列表中的計(jì)算數(shù)據(jù)。計(jì)算數(shù)據(jù)通常不保存在數(shù)據(jù)庫(kù)中。
5. 將數(shù)據(jù)放在第一遍的標(biāo)準(zhǔn)化格式中:
6. 從tables及relationships除去重復(fù)的數(shù)據(jù)。
7. 以你所除去數(shù)據(jù)創(chuàng)建一個(gè)或更多的tables及relationships。
8. 將數(shù)據(jù)放在第二遍的標(biāo)準(zhǔn)化格式中:
9. 用多于一個(gè)以上的鍵確定tables及relationships。
10. 除去只依賴于鍵一部分的數(shù)據(jù)。
11. 以你所除去數(shù)據(jù)創(chuàng)建一個(gè)或更多的tables及relationships。
12. 將數(shù)據(jù)放在第三遍的標(biāo)準(zhǔn)化格式中:
13. 除去那些依賴于tables或relationships中其他數(shù)據(jù),并且不是鍵的數(shù)據(jù)。
14. 以你所除去數(shù)據(jù)創(chuàng)建一個(gè)或更多的tables及relationships。
數(shù)據(jù)與鍵
在你開始標(biāo)準(zhǔn)化(測(cè)試數(shù)據(jù))前,簡(jiǎn)單地列出數(shù)據(jù),并為每張表確定一個(gè)唯一的主鍵。這個(gè)鍵可以由一個(gè)字段或幾個(gè)字段(連鎖鍵)組成。
主鍵是一張表中唯一區(qū)分各行的一組字段。Employee表的主鍵是Employee ID字段。Works In relationship中的主鍵包括Office Code及Employee ID字段。給數(shù)據(jù)庫(kù)中每一relationship給出一個(gè)鍵,從其所連接的每一個(gè)table中抽取其鍵產(chǎn)生。

將數(shù)據(jù)放在第一遍的標(biāo)準(zhǔn)化格式中
● 除去重復(fù)的組
● 要測(cè)試第一遍標(biāo)準(zhǔn)化格式,除去重復(fù)的組,并將它們放進(jìn)他們各自的一張表中。
● 在下面的例子中,Phone Number可以重復(fù)。(一個(gè)工作人員可以有多于一個(gè)的電話號(hào)碼。)將重復(fù)的組除去,創(chuàng)建一個(gè)名為Telephone的新表。在Telephone與Office創(chuàng)建一個(gè)名為Associated With的relationship。
將數(shù)據(jù)放在第二遍的標(biāo)準(zhǔn)化格式中
● 除去那些不依賴于整個(gè)鍵的數(shù)據(jù)。
● 只看那些有一個(gè)以上鍵的tables及relationships。要測(cè)試第二遍標(biāo)準(zhǔn)化格式,除去那些不依賴于整個(gè)鍵的任何數(shù)據(jù)(組成鍵的所有字段)。
● 在此例中,原Employee表有一個(gè)由兩個(gè)字段組成的鍵。一些數(shù)據(jù)不依賴于整個(gè)鍵;例如,department name只依賴于其中一個(gè)鍵(Department ID)。因此,Department ID,其他Employee數(shù)據(jù)并不依賴于它,應(yīng)移至一個(gè)名為Department的新表中,并為Employee及Department建立一個(gè)名為Assigned To的relationship。

將數(shù)據(jù)放在第三遍的標(biāo)準(zhǔn)化格式中
● 除去那些不直接依賴于鍵的數(shù)據(jù)。
● 要測(cè)試第三遍標(biāo)準(zhǔn)化格式,除去那些不是直接依賴于鍵,而是依賴于其他數(shù)據(jù)的數(shù)據(jù)。
● 在此例中,原Employee表有依賴于其鍵(Employee ID)的數(shù)據(jù)。然而,office location及office phone依賴于其他字段,即Office Code。它們不直接依賴于Employee ID鍵。將這組數(shù)據(jù),包括Office Code,移至一個(gè)名為Office的新表中,并為Employee及Office建立一個(gè)名為Works In的relationship。

4.考量關(guān)系
當(dāng)你完成標(biāo)準(zhǔn)化進(jìn)程后,你的設(shè)計(jì)已經(jīng)差不多完成了。你所需要做的,就是考量關(guān)系。
考量帶有數(shù)據(jù)的關(guān)系
你的一些relationship可能集含有數(shù)據(jù)。這經(jīng)常發(fā)生在多對(duì)多的關(guān)系中。

遇到這種情況,將relationship轉(zhuǎn)化為一個(gè)table。relationship的鍵依舊成為table中的鍵。
考量沒(méi)有數(shù)據(jù)的關(guān)系
要實(shí)現(xiàn)沒(méi)有數(shù)據(jù)的關(guān)系,你需要定義外部鍵。外部鍵是含有另外一個(gè)表中主鍵的一個(gè)或多個(gè)字段。外部鍵使你能同時(shí)連接多表數(shù)據(jù)。
有一些基本原則能幫助你決定將這些鍵放在哪里:
一對(duì)多 在一對(duì)多關(guān)系中,“一”中的主鍵放在“多”中。此例中,外部鍵放在Employee表中。

一對(duì)一 在一對(duì)一關(guān)系中,外部鍵可以放進(jìn)任一表中。如果必須要放在某一邊,而不能放在另一邊,應(yīng)該放在必須的一邊。此例中,外部鍵(Head ID)在Department表中,因?yàn)檫@是必需的。

多對(duì)多 在多對(duì)多關(guān)系中,用兩個(gè)外部鍵來(lái)創(chuàng)建一個(gè)新表。已存的舊表通過(guò)這個(gè)新表來(lái)發(fā)生聯(lián)系。

5.檢驗(yàn)設(shè)計(jì)
在你完成設(shè)計(jì)之前,你需要確保它滿足你的需要。檢查你在一開始時(shí)所定義的行為,確認(rèn)你可以獲取行為所需要的所有數(shù)據(jù):
● 你能找到一個(gè)路徑來(lái)等到你所需要的所有信息嗎?
● 設(shè)計(jì)是否滿足了你的需要?
● 所有需要的數(shù)據(jù)都可用嗎?
如果你對(duì)以上的問(wèn)題都回答是,你已經(jīng)差不多完成設(shè)計(jì)了。
最終設(shè)計(jì)
最終設(shè)計(jì)看起來(lái)就像這樣:

設(shè)計(jì)數(shù)據(jù)庫(kù)的表屬性
數(shù)據(jù)庫(kù)設(shè)計(jì)需要確定有什么表,每張表有什么字段。此節(jié)討論如何指定各字段的屬性。
對(duì)于每一字段,你必須決定字段名,數(shù)據(jù)類型及大小,是否允許NULL值,以及你是否希望數(shù)據(jù)庫(kù)限制字段中所允許的值。
選擇字段名
字段名可以是字母、數(shù)字或符號(hào)的任意組合。然而,如果字段名包括了字母、數(shù)字或下劃線、或并不以字母打頭,或者它是個(gè)關(guān)鍵字(詳見關(guān)鍵字表),那么當(dāng)使用字段名稱時(shí),必須用雙引號(hào)括起來(lái)。
為字段選擇數(shù)據(jù)類型
SQL Anywhere支持的數(shù)據(jù)類型包括:
整數(shù)(int, integer, smallint)
小數(shù)(decimal, numeric)
浮點(diǎn)數(shù)(float, double)
字符型(char, varchar, long varchar)
二進(jìn)制數(shù)據(jù)類型(binary, long binary)
日期/時(shí)間類型(date, time, timestamp)
用戶自定義類型
關(guān)于數(shù)據(jù)類型的內(nèi)容,請(qǐng)參見“SQL Anywhere數(shù)據(jù)類型”一節(jié)。字段的數(shù)據(jù)類型影響字段的最大尺寸。例如,如果你指定SMALLINT,此字段可以容納32,767的整數(shù)。INTEGER可以容納2,147,483,647的整數(shù)。對(duì)CHAR來(lái)講,字段的最大值必須指定。
長(zhǎng)二進(jìn)制的數(shù)據(jù)類型可用來(lái)在數(shù)據(jù)庫(kù)中保存例如圖像(如位圖)或者文字編輯文檔。這些類型的信息通常被稱為二進(jìn)制大型對(duì)象,或者BLOBS。
關(guān)于每一數(shù)據(jù)類型的完整描述,見“SQL Anywhere數(shù)據(jù)類型”。
NULL與NOT NULL
如果一個(gè)字段值是必填的,你就將此字段定義為NOT NULL。否則,字段值可以為NULL值,即可以有空值。SQL中的默認(rèn)值是允許空值;你應(yīng)該顯示地將字段定義為NOT NULL,除非你有好理由將其設(shè)為允許空值。
關(guān)于NULL值的完整描述,請(qǐng)見“NULL value”。有關(guān)其對(duì)比用法,見“Search conditions”。
選擇約束
盡管字段的數(shù)據(jù)類型限制了能存在字段中的數(shù)據(jù)(例如,只能存數(shù)字或日期),你或許希望更進(jìn)一步來(lái)約束其允許值。
你可以通過(guò)指定一個(gè)“CHECK”約束來(lái)限制任意字段的值。你可以使用能在WHERE子句中出現(xiàn)的任何有效條件來(lái)約束被允許的值,盡管大多數(shù)CHECK約束使用BETWEEN或IN條件。
更多信息
有關(guān)有效條件的更多信息,見“Search conditions”。有關(guān)如何為表及字段指定約束,見“Ensuring Data Integrity”。
例子
例子數(shù)據(jù)庫(kù)中有一個(gè)名為department的表,字段是dept_id, dept_name, dept_head_id。其定義如下:

注意每一字段都被指定為“not null”。這種情況下,表中每一記錄的所有字段的數(shù)據(jù)都必填。
選擇主鍵及外部鍵
主鍵是唯一識(shí)別表中每一項(xiàng)記錄的字段。如何你的表已經(jīng)正確標(biāo)準(zhǔn)化,主鍵應(yīng)當(dāng)成為數(shù)據(jù)庫(kù)設(shè)計(jì)的一部分。
外部鍵是包含另一表中主鍵值的一個(gè)或一組字段。外部鍵關(guān)系在數(shù)據(jù)庫(kù)中建立了一對(duì)一及一對(duì)多關(guān)系。如果你的設(shè)計(jì)已經(jīng)正確標(biāo)準(zhǔn)化,外部鍵應(yīng)當(dāng)成為數(shù)據(jù)庫(kù)設(shè)計(jì)的一部分。