資料庫系統概論第 十二章 多表格資料庫設計   上一頁    下一頁

12-2 範例研討圖書館管理系統

內容:

12-2-1 需求分析與資料收集

起初萬聖宮圖書室建立時,收藏圖書還不是很多,村民借書/還書都還不是很困難。但經過幾年之後,圖書室功能漸漸顯著,村民閱讀風氣業逐漸打開,除了各地捐輸之外,萬聖宮也採購許多書籍以供村民閱讀。如此一來,圖書室亦發展成規模不小的圖書館。萬聖宮總幹事有感於此,原來圖書管理系統已不符所需,期望建立一套較完整的圖書館管理系統,期望功能如下:

  • 所有圖書皆登錄於該系統內。

  • 可瀏覽圖書館內所有書籍。

  • 可經由作者姓名、出版商或書名,查詢到那些書籍。

  • 圖書可以任意增加或刪除。

  • 每一本書都有固定位置,借書或還書都可以由固定區域存取。

  • 可登錄村民借用那些書籍。

  • 可催收逾期借用書籍。

  • 可由書籍名稱查詢出哪位村民借用,以及借書日期。

另外,總幹事也希望系統能登錄下列相關資料:

  • (a) 書籍資料:書名、作者、出版社、放置位置、書籍分類、書籍來源、購買金額。

  • (b) 借書者:姓名、性別、電話、地址、電話。

圖書館也準備了借書卡,以供村民申請借書、還書之依據。

12-2-2 資料庫邏輯設計

此系統有比較複雜一點,我們由外往內拆解方法,來分析此系統的邏輯架構。

(A) 第一層分析:系統需求

吾人可以發現,此管理系統提供圖書登錄與村民閱讀的功能,如下圖所示。

11-6 圖書館管理系統概況

(B) 第二層分析:圖書分類

首先,我們先拆解圖書出版狀況,每一本書大多由某一家出版社發行,分析如下:

(C) 第三層分析:村民借用圖書閱讀

村民借用圖書閱讀之關聯。我們假設一位村民可以借用多本圖書,則村民與圖書總表之間的關係是一對多的關係。另外,一家出版商也可能發行多本圖書,之間也是一對多的關係。每位村民也可以多次借書,村民與借書紀錄之間也是一對多的關係。如下分析:

(D) 填入各實體的屬性

接著我們依照系統所需的資料填入各個實體上,如下圖:

(E) 選定各實體的主鍵

對各實體的主鍵選定步驟如下:

  • 圖書總表:將所有屬性填入後,找不到唯一識別值,增加『圖書編碼』屬性,並指定為主鍵。

  • 出版商:增列『出商編碼』屬性,並指定為主鍵。

  • 村民:增列『身分證字號』屬性,並指定為主鍵。

  • 借書紀錄:因每位村民可以同時借用多本書,增列 {身分證號、圖書編碼} 兩屬性,並指定為主鍵。

(F) 建立外來鍵連結完整系統 E-R 關聯圖

  • (a) 圖書總表增加『出版編碼』為外來鍵,並參考到出版商的『出商編碼』,建立兩實體之間關係。

  • (b) 且將借書紀錄的『身分證號』設定為外來鍵,並參考到村民實體的『身分證號』,建立借書紀錄與村民實體之間的關係。

  • (c) 且將借書紀錄的『圖書編碼』設定為外來鍵,並參考到圖書總表實體的『圖書編碼』,建立借書紀錄與圖書總表之間的關係。

完成後結果,如下圖所示:

     

11-11 E-R 關聯圖

12-2-3 E-R 圖轉換資料表

(A) 圖書總表關聯

下圖為圖書總表的關聯(Relation),它包含了 6 個屬性(Attribute),我們找出圖書編碼可以當作每一筆紀錄的唯一識別碼,並將它指定為主鍵(Primary key)

11-12 圖書總表關聯

並且將此關聯定名為 Books 資料表,各屬性之欄規劃如下:

圖書編號

圖書名稱

作者

出版商編碼

備註

價格

放置位置

Book_ID

title

author

Pub_ID

remark

price

place

int

CHAR(50)

CHAR(20)

CHAR(20)

CHAR(50)

int

CHAR(20)

其中,備註欄位記錄書籍來源(採購、捐贈)或其他訊息。價格該本書購買金額或捐贈人認為價值多少錢。

正規化分析:

  • 1NF所有欄位都是最小單元(Atomic value)符合。

  • 2NF除了主鍵外,所有欄位都與主鍵相依:符合。

  • 3NF除了主鍵外,所有欄位之間都沒有功能性相依:符合。

(B) 出版商關聯

出版商關聯(Relation)包含了 5 個屬性(Attribute),我們找出版商編碼可以當作每一筆紀錄的唯一識別碼,並將它指定為主鍵(Primary key)

11-13 出版商關聯

並且將此關聯定名為 Publishers 資料表,各屬性之欄規劃如下:

出版商編碼

出版商名稱

聯絡人

電話

地址

Pub_ID

pub_name

contact

tel

address

int

CHAR(20)

CHAR(20)

CHAR(20)

CHAR(50)

其中,書籍來源有採購與捐贈兩種可能。價格該本書購買金額或捐贈人認為價值多少錢。

正規化分析:

  • 1NF所有欄位都是最小單元(Atomic value)符合

  • 2NF除了主鍵外,所有欄位都與主鍵相依:符合

  • 3NF除了主鍵外,所有欄位之間都沒有功能性相依:符合

(C) 村民關聯

村民關聯(Relation)包含了 5 個屬性(Attribute),很容易地可以看出,選用身分證字號當為主鍵(Primary key)

11-14 村民關聯

並且將此關聯定名為 Guests 資料表,各屬性之欄規劃如下:

身分證字號

姓名

性別

電話

地址

Guest_ID

name

sex

tel

address

CHAR(20)

CHAR(20)

CHAR(20)

CHAR(20)

CHAR(50)

其中,書籍來源有採購與捐贈兩種可能。價格該本書購買金額或捐贈人認為價值多少錢。

正規化分析:

  • 1NF所有欄位都是最小單元(Atomic value)符合

  • 2NF除了主鍵外,所有欄位都與主鍵相依:符合

  • 3NF除了主鍵外,所有欄位之間都沒有功能性相依:符合

(C) 借書紀錄關聯

借書紀錄關聯(Relation)包含了 3 個屬性(Attribute)。系統允許每位村民同時可以借用多本書籍,因此不能只用身分證字號當主鍵,必須 {身分證字號, 書籍編碼}兩欄位當為主鍵(Primary key)

11-15 借書紀錄關聯

並且將此關聯定名為 Records 資料表,各屬性之欄規劃如下:

身分證字號

圖書編號

借書日期

Guest_ID

Book_ID

date

CHAR(20)

CHAR(20)

DATE

正規化分析:

  • 1NF所有欄位都是最小單元(Atomic value)符合

  • 2NF除了主鍵外,所有欄位都與主鍵相依:符合

  • 3NF除了主鍵外,所有欄位之間都沒有功能性相依:符合

12-2-4 資料庫關聯圖

設計完成各個資料表之後,再依照 E-R 關聯圖繪出資料庫內所有資料表之間的關聯圖,如下:

11-16 資料庫關聯圖

12-2-5 實體建置

我們將此資料庫定名為『temple_library』,並利用 AppServ – MySQL 建立,步驟如下:(備註:僅介紹用 SQL 命令產生,選單方式建立請自行參考)

(A) 建立資料庫

吾人將此資料庫定名為:temple_library,則下列兩種方法產生,如下:

  • 利用 SQL 命令為:

Create Database temp_library;

  • 利用選單方式:

(B) 建立 Books 資料表

建立 Books 命令如下如下:(選擇 temple_library 資料庫)

Create Table Books (

Book_ID int auto_increment,

title  CHAR(50) NOT NULL,

author  CHAR(20) NOT NULL,

Pub_ID  int  NOT NULL,

price int,

place  CHAR(20) ,

remark  CHAR(50) ,

primary key (Book_ID)

)

如果設定完成之後,可觀察 Books 資料表的結構如下:

其特性說明如下:

  • (a) Books 資料表共有 7 個欄位,分別是:Book_IDauthorPub_IDtitleplaceprice remark

  • (b) Book_ID 欄位是主鍵,是系統自動產生的整數,也是個筆資料之間的唯一識別值(不允許有兩筆以上的紀錄,NO 欄位內容相同)

  • (c) Book_IDauthorPub_ID title等欄位不允許空值,一定必須填入內容,其他三個欄位允許空值。

(B) 建立 Publishers 資料表

建立 publishers 命令如下如下:(選擇 temple_library 資料庫)

Create Table publishers (

Pub_ID int auto_increment,

Pub_name  CHAR(50) NOT NULL,

contact  CHAR(20) ,

tel  CHAR(20) ,

address  CHAR(50) ,

primary key (Pub_ID)

)

如果設定完成之後,可觀察 Publishers 資料表結構,如下:

其特性說明如下:

  • (a) publishers 資料表共有 5 個欄位,分別是:Pub_IDPub_namecontacttel address

  • (b) Pub_ID 欄位是主鍵,是系統自動產生的整數,也是個筆資料之間的唯一識別值(不允許有兩筆以上的紀錄,NO 欄位內容相同)

  • (c) Pub_IDPub_name欄位不允許空值,一定必須填入內容,其他三個欄位允許空值。

(C) 建立 Guests 資料表

建立 Guests 命令如下如下:(選擇 temple_library 資料庫)

Create Table Guests (

Guest_ID CHAR(20) NOT NULL,

name  CHAR(20) NOT NULL,

sex  CHAR(20) ,

tel  CHAR(20) ,

address  CHAR(50) ,

primary key (Guest_ID)

)

如果設定完成之後,可觀察 Guests 資料表結構,如下:

其特性說明如下:

  • (a) Guests 資料表共有 5 個欄位,分別是:Guest_IDnamesextel address

  • (b) Guest_ID 欄位是主鍵,是系統自動產生的整數,也是個筆資料之間的唯一識別值(不允許有兩筆以上的紀錄,NO 欄位內容相同)

  • (c) Guest_IDname欄位不允許空值,一定必須填入內容,其他三個欄位允許空值。

(D) 建立 Records 資料表

建立 Records 命令如下如下:(選擇 temple_library 資料庫)

Create Table Records (

Guest_ID CHAR(20) NOT NULL,

Book_ID int NOT NULL,

date  DATE,

primary key (Guest_ID, Book_ID)

)

如果設定完成之後,可觀察 Records 資料表結構如下:

其特性說明如下:

  • (a) Records 資料表共有 3 個欄位,分別是:Guest_IDBook_ID date

  • (b) Guest_ID Book_ID 兩欄位組合成主鍵。

(D) 觀察 Temple_Library 資料庫結構

建立完成四個資料表之後,可以觀察 Temple_library 資料庫的結構如何,如下:

 (E) 建立資料表之間關連

我們依照圖 11-8 資料庫關聯圖內,可以觀察到各個資料表之間的關聯,如下:

  • (a) Books 資料表的 Pub_ID 是外來鍵(Foreign Key),是參考到 Publishers 資料表的 Pub_ID 欄位。

  • (b) Records 資料表的 Book_ID 是外來鍵,是參考到 Books 資料表的 Book_ID 欄位。

  • (c) Records 資料表的 Guest_ID 是外來鍵,是參考到 Guests 資料表的 Guest_ID 欄位。

建立外來鍵命令如下:

Alter Table Books

ADD Foreign key (Pub_ID) References publishers(Pub_ID);

Alter Table Records

ADD Foreign key (Book_ID) References Books(Book_ID);

Alter Table Records

ADD Foreign key (Guest_ID) References Guests(Guest_ID);

執行成功後,點選 AppServ 的『設計』選單,可以觀察到 Temple_Library 資料內各個資料表之間的關聯,如下:

12-2-6 建立測試資料

資料庫與資料表建立完成之後,需產生相關資料來驗證其運作是否能滿足需求。建立測試資料的步驟如下:

  • (a) 依照資料表內個欄位的屬性,利用 Excel 相關資料,注意:Excel 欄位的順序要與資料表欄位順相同。

  • (b) Excel 建立資料後,再『另存新檔』,成『csv(逗點分隔)』格式。

  • (c) 利用『記事本』將 csv 檔開啟後,再另存新檔,編碼選擇『UFT 8』格式。

  • (d) 開啟資料庫,再匯入相關資料表內。

(A) 建立 Books 資料並匯出 CSV

首先開啟 Excel 並輸入相關資料(取名 Books,第一行為欄位名稱),如下圖所示:(可到教學網站下載)

轉換成 CSV 格式如下:

(B) 建立 Publishers 資料並匯出 CSV

利用 Excel 建立 Publishers 檔案內容如下:

轉換成 CSV 檔內容如下:

(C) 建立 Guests 資料並匯出 CSV

利用 Excel 建立 Guests 檔案內容如下:

轉換成 CSV 檔內容如下:

(D) 建立 Records 資料並匯出 CSV

利用 Excel 建立 Records 檔案如下:

轉換成 CSV 檔內容如下:

12-2-7 匯入測試資料

 匯入資料時必須考慮到資料表的外來鍵是否存在,不然會產生錯誤。由圖 11-8 Temple_library 資料庫關聯看出來,匯入資料的順序是『Publishers -> Books -> Guests -> Records』。

(A) 匯入 Publishers CSV

Temple_Library 資料庫選擇 Publishers 資料表並匯入 Publishers CSV 檔,結果如下:

(B) 匯入 Books CSV

Temple_Library 資料庫選擇 Books 資料表並匯入 Books CSV 檔,結果如下:

(C) 匯入 Guests CSV

Temple_Library 資料庫選擇 Guests 資料表並匯入 Guests CSV 檔,結果如下:

(D) 匯入 Records CSV

Temple_Library 資料庫選擇 Records 資料表並匯入 Records CSV 檔,結果如下:

12-2-8 測試資料庫功能

資料庫建構完成後,我們依照幾個系統需求,來驗證其功能是否滿足。(但還需要參考該資料庫的 E-R 關係圖)

(A) 驗證 1查詢某位作者有哪些藏書

查詢圖書館有收藏作者粘添壽那些書籍,請書籍名稱、出版社與價格,SQL 命令如下:

        

select A.title, B.pub_name, A.price

from Books as A, publishers as b

where A.author ="粘添壽"

And A.Pub_ID = B.Pub_ID;

執行結果:

(B) 驗證 2查詢村民借用那些書,以及借書日期

查詢郭大偉先生借了那些書籍,以及借用日期,SQL 命令如下:

           

select A.title, B.date

from books as A, (select Book_ID, date

                             from records

                            where Guest_ID = (select guest_ID

                                                           from guests

                                                          where name = "郭大豪")) as B

where A.Book_ID = B.Book_ID;

執行結果:

(C) 驗證 3由圖書公司查詢有哪些書

查詢圖書館有那些翻轉工作室出版的書籍,請列印出書名、作者與價格,SQL 命令如下:

select title, author, price

from books

where pub_ID = (select Pub_ID

                            from publishers

                            where pub_name = "翻轉工作室");

執行結果:

 

(D) 驗證 4查詢書本出借狀況

查詢『資料庫程式設計』這本書出借的情況,如已出借請列印出借書人與日期。

         

select A.name, B.date

from guests as A, (select Guest_ID, date

                            from records

                           where Book_ID = (select Book_ID

                                                        from books

                                                        where title = "資料庫程式設計")) as B

where A.guest_ID = B.guest_ID;

執行結果:

(D) 驗證 5更新 Records 資料表

測試當村民編號 Guest_ID = A013 借用書籍編號 Book_ID = 12 時,更新 Records 資料表,SQL 命令如下:

Insert into records

    values("A013", "12", "");

update records

         set date = (select date(now()))

where Guest_ID = "A013"

and Book_ID = "12";

接著查詢 Records 資料表是否有增列此筆資料,SQL 命令如下:

select *

from records

where Guest_ID = "A013";

執行結果:

翻轉工作室:粘添壽

 

資料庫系統概論(含邏輯設計)

 

 

翻轉電子書系列: