Transcript Slide 1

Chapter 16
Persistent Data
Design หรือ
Database Design
โดยใช้ Relational
Database
จุดประสงค ์
่ น้ ั กศึกษาเขา้ ใจในกระบวนการในการออกแบบ
1. เพือให
เ พื ่ อ ก า ร เ ก็ บ ข ้ อ มู ล ข อ ง
Class ต่างๆ ไว ้อย่างถาวรได ้
่ นักศึกษาเขา้ ใจความสัมพันธ ์และการแปลง
2. เพือให้
ร ะ ห ว่ า ง Class
กั บ
Relational Database
1
6
.
1
Relational
่ ย
Database
Relational Database คือระบบฐานขอ้ มูลทีอาศั
่
Relation หรือตาราง (Table) เพือแสดงค่
าและความสัมพันธ ์
่ บอยู่ในแต่ละช่องของ Table เรียกว่า
ของขอ้ มูล ขอ้ มูลทีเก็
Data Item ในทาง Relational Database แต่ละกลุ่มของ
่ นว่
้ า Field Name
Data Item จะมีชอของตนเอง
ื่
เรียกชือนั
หรือ Column Name กลุ่มของขอ้ มูลทีมี่ Column Name
่ า Column หลายๆ
เหมือนกัน เรียกว่า Column และเมือน
่
Column ทีแตกต่
างกันมาเรียงต่อกันจะได ้ Tuple หรือ Row
่
ของขอ้ มูล และ Row หลายๆ Row เมือรวมกั
นจะได ้ Table
่ าเอา Table ทีมี่ ความสัมพันธ ์กันมารวมกันจะได ้
และเมือน
่
ฐานข ้อมูล (Database) นันเอง
Data
Item
Id
Name
Addres
s
001
Kit
Ayutthay
a
002
Colu
mn
Noi
Bangkok
Field
Name
Ro
w
รูป โครงสร ้างของ Table ใน
Relational Database
Tab
le
ในแต่ละ Row ของ Database จะเป็ นกลุ่มของ Data
Item ทีบ่่ งชีถึ้ ง Entry หรือกลุ่มของ Attributes ของ Object
้
แต่ละตัว ดังนันในแต่
ละ Row จะต ้องมี Data Item อย่างน้อย
่ นตัวบ่งชี ้ (Identity) ว่า Row นันบรรจุ
้
1 ตัวทีจะเป็
ขอ้ มูลทีต่่ าง
Row กัน กล่าวคือ จะตอ้ งเลือกเอา Column อย่างน้อย 1
่ วบ่งชีของ
้
Column มาเป็ นตัวบ่งชีดั้ งกล่าว ซึงตั
Row ใด
้ บตัวบ่งชีของ
้
Row หนึ ง่ จะตอ้ งไม่ซากั
Row อืน่ และเรียก
่ นตัวบ่งชีนั้ นว่
้ า Key หรือ Primary Key
Column ทีเป็
่ อ้ งการทีจะแสดงความสั
่
ในขณะเดีย วกัน เมือต
ม พัน ธ ร์ ะหว่ า ง
่ บอีก Table หนึ ง่ สิงที
่ จ่ าเป็ นตอ้ งมีคอื ขอ้ มูลสักตัวหนึ งที
่ จะ
่
Table หนึ งกั
่
สามารถบ่งชีถึ้ งความสัมพันธ ์ระหว่าง 2 Table ได ้ ซึงในหลั
กการของ
้ จะใช ้การอา้ งอิง (Reference) เพือบ่
่ งชี ้
Relational Database นัน
่ ใช
่ ้เพือการอ
่
้ ยกว่า Foreign
ความสัมพันธ ์ระหว่าง 2 Table สิงที
า้ งอิงนี เรี
่
่ Table ทีจะเก็
่
Key ซึงหมายถึ
ง Column หนึ งใน
บ Primary Key ของ
่ Name:
่ ้ในการอ ้างถึง หรือแสดงความสัมพันธ ์
Table
อีก Table หนึ
งไว
้เพือใช
Person
Id
Nam
e
Addr
ess
001
Kit
003
002
Noi
001
Foreign
Key
Primary
Key
รูป Primary Key และ
Foreign Key
Table Name:
Province
Prov_I Provin
d
ce
001
Bangk
ok
002
Nonta
buri
003
Ayutth
จากรูปเป็ นภาพแสดง ตัวอย่างของ Primary Key และ
Foreign Key ในภาพ เป็ น Table ของบุคคล (Person) และ
่
ว้ ยตัวเอียง
จังหวัด (Province) โดย Data Item ทีแสดงด
หนาขีดเสน้ ใต ้ คือ Primary Key (Primary Key ของ
Person คือ Id ในขณะที ่ Primary Key ของ Province คือ
Prov_Id ) และตัวอักษรเอียงคือ Foreign Key ตัวอย่างเช่น
่
ใน Table Person จะมี Foreign Key ชือ่ Address ซึงใน
่ ่ใน Column นี ได
้ จ้ ะตอ้ งเป็ นค่าใด
ความเป็ นจริงแลว้ ค่าทีอยู
่ Column
ค่าหนึ งใน
Prov_Id ของ Table
Province
กล่าวคือ ค่าใน Column Address จะตอ้ งอา้ งอิงตาม
้
Prov_Id
เสมอนั ่นเอง จากทังสอง
Table
ขา้ งตน้ จะ
ตีความหมายไดว้ ่า Kit อยู่ทจั
ี ่ งหวัด Ayutthaya ในขณะที ่
่
Noi อยูท
่ จั
ี ่ งหวัด Bangkok นันเอง
จากทีผ่่ านมาไดพ
้ ูดถึง Class
Diagram จะพบว่า
่ Class Diagram นัน
้ ตอ้ งมี
Class ใด Class หนึ งใน
ความสัม พัน ธ ก์ น
ั ในรู ป แบบใดรู ป แบบหนึ ่ง (Aggregation,
่ าง
Generalization หรือ Association) กับ Class อืนอย่
้
น้อ ย 1 Class
เสมอ ดัง นั นการออกแบบ
Relational
่ บขอ้ มูล (หรือ Attributes) ของ Class
Database เพือเก็
ต่ า ง ๆ จึ ง จ า เ ป็ น ต ้อ ง แ ส ด ง ค ว า ม สั ม พั น ธ ข
์ อ ง Table
่ ใช
่ ้เพือเชื
่ อม
่
เช่นเดียวกัน ใน Relational Database นัน้ สิงที
่
ความสัมพันธ ์ระหว่าง Table ก็คอื Foreign Key นันเอง
1 6 . 2 ห ลั ก ก า รใ น ก า ร แ ป ล ง จ า ก Class
Diagram สู ่ Relational Database
CREATE TABLE PERSON
( ID
CHAR(10) NOT NULL,
NAME
CHAR(50) NOT
NULL,
SEX
CHAR(1) NOT NULL,
AGE
INTEGER NOT
NULL,
HEIGHTREAL NOT NULL,
JOB
CHAR(1),
PRIMARY KEY = ID,
่ อ่ Person ซึงมี
่
ตัวอย่FOREIGN
างนี ้ เป็ นประโยคในการสร
้าง Table
ทีชื
KEY JOB
REFERENCES
้
ข้
อ
มู
ล
หรื
อ
Column
ต่
า
งๆ
ดั
ง
นี
JOB_DB )
-Id
-Name
่ บหมายเลขประจาตัวของบุคคล
ใช ้เพือเก็
่ บชือของบุ
่
ใช ้เพือเก็
คคล
่ บ เพศ อายุ และ ส่วนสูง ของ
-Sex, Age, Heightใช ้เพือเก็
บุคคล
-Char(n)
หมายถึ ง การก าหนดชนิ ด และขนาด
ของข ้อมูล ให ้เป็ น
ตัวอักษรทีมี่ ขนาด n เช่น
Id Char(10) หมายถึงให้ Column
Id
่ ความยาวได ้สูงสุด 10 ตัวอักษร
มีชนิ ดเป็ นตัวอักษร ซึงมี
-Integer และ Real หมายถึง การกาหนดชนิ ดของขอ้ มูลให้
เป็การมี
น จานวนเต็
มและ Null อยู
จานวนจริ
ง ตามลาดับ ใด หมายถึง
วลี Not
่ทา้ ย Column
้ จะต้องมีคา่ เสมอ
Column นัน
-Primary Key = Id
หมายถึง การกาหนดให้ Id เป็ น
Primary Key ของ Table นี ้
-Foreign Key Job Reference Job_DB
หมายถึง การกาหนดให้ Column ชือ่ Job เป็ น
Foreign Key อ ้างอิง
ไปยัง Table ชือ่ Job_DB
16.2.1 หลัก การในการแปลง
Class ให้เป็ น Table
กาหนดให้ Attribute ตัวใดตัวหนึ ง่ หรือกลุ่มใด
่ น Primary Key
กลุม
่ หนึ งเป็
 สร ้าง Table ทีมี่ ทุกๆ Attributes ของ Class
นัน้ และมี Primary Key ตามทีก่ าหนดมาแล ้ว
่ น
 Attribute หรือกลุ่มของ Attribute ทีเป็
Primary Key ต ้องถูกกาหนดเป็ น Not Null เสมอ
่ ทีไม่
่ ได ้ถูกเลือกให้
 สาหรับ Attributes อืนๆ
เป็ น Primary Key ใหพ
้ จิ ารณาว่า Attributes ใดเป็ น
Null ได ้ และ Attributes ใดเป็ น Null ไม่ได ้
ในการออกแบบ Table ไม่ต ้องสนใจในส่วนของ
Function ให้มุ่งความสนใจไปยัง Attributes ต่างๆ เท่านัน้
ตัวอย่
าง
Offic
-Officer_Id
er
-Office_Id
Officer_Na
me
-Gender
-Salary
+Get_Id()
-Page_no
+Get_Nam
e()
+Set_Id()
+Set_Nam
e()
+Get_Page
_No()
+Set_Page
_No()
+Get_Salar
y()
+Set_Salar
y()
+Get_Gen
Create Table Officer
( Officer_Id
Char(10)
Not Null,
Office_Id
Char(5),
Officer_Name
Char(50) Not Null,
Gender
Char(1) Not Null,
Salary
Integer,
Page_No
สังเกตดีๆ ว่Cahr(7),
าได้มา
Primary Key = Officer_Id
อย่
า
งไร
…!
)
่ ความสัมพันธ ์
16.2.2 หลักการแปลง Class ทีมี
่ มพันธ ์กัน
กันแบบ Aggregation ให้เป็ น Table ทีสั
 ออกแบบ Table จาก Class ทัง้ 2 ขา้ งของ
่
่ ้แนะนาไปแล ้ว
เครืองหมาย
Aggregation ทีได

การแสดงความสัมพันธ ์ของ Table ใน
้ ใหน้ าเอา Primary Key
Relational Database นัน
(อาจจะเป็ น Field เดียวหรือกลุ่มของ Field ก็ได)้ ของ
Main Class มาเป็ น Foreign
Key
ของ
่ เหมือนกับการเอาชือของพ่
่
Composite Class ซึงก็
อแม่
่ อแม่พาลูกออกไปเทียว
่ เวลาทีลู่ กสูญ
ไปเก็บไว ้ทีลู่ ก เมือพ่
หาย ต ารวจจะได ท
้ ราบพ่ อ แม่ คือใคร แต่ ถ า้ หากปฏิบ ั ติ
ในทางกลับกันตารวจจะไม่สามารถตามหาลูกทีสู่ ญหายได ้
ในการใส่ Foreign Key เขา้ ไปยัง Composite
้ ต ้องพิจารณาด ้วยว่า Foreign Key นันเป็
้ นค่า
Class นัน
Null ได ้หรือไม่ โดยดูจาก Minimal Cardinality เช่น ถา้
หาก Cardinality ทีฝั่ ง่ Composite Class เป็ น 0..n แสดง
่
ว่า Main Class มีสท
ิ ธิที์ จะไม่
ตอ้ งมี Composite Class
้ Foreign Key ตัวนี สามารถเป็
้
ประกอบอยู่เลยก็ได ้ ดังนัน
น
Null ได ้ แต่ในทางกลับกัน หากว่า Cardinality ทีฝั่ ง่
่
Composite Class เป็ น 1..n นันหมายความว่
า ในทุกๆ
ช่วงเวลาจะต ้องมี Composite Class ประกอบอยู่ใน Main
้ Foreign Key ตัวนี ไม่
้ มสี ท
Class เสมอ ดังนัน
ิ ธิเป็์ น Null
ได ้เลย
ตัวอ
ย่าง
Depart
ment
-Dept_Id
+Get_Id()
Dept_Na
+Set_Id()
me
+Get_Na
me()
+Set_Na
me()
Create Table Officer
( Officer_Id Char(10) Not
Null,
Office_Id Char(5),
Officer_Name
Char(50) Not Null,
Gender
Char(1) Not Null,
Salary
Integer,
Page_No Char(7),
1..
n
Offi
ce
-Office_Id
Office_Na
me
+Get_Id()
-+Set_Id()
Phone_N
+Get_Nam
o
e()
+Set_Nam
e()
+Get_Phon
e_No()
+Set_Phon
e_No()
0..
n
Offi
cer
Officer_Id
-Office_Id
Office_Na
me
-Gender
+Get_Id()
-Salary
+Set_Id()
+Get_Nam
Phone_N
e()
o
+Set_Nam
e()
+Get_Page
_No()
+Set_Page_
No()
+Get_Salar
y()
+Set_Salar
y()
+Get_Gend
er()
่ ค วามสัม พัน ธ ์
16.2.3 หลัก การแปลง Class ทีมี
่ มพันธ ์กัน
กันแบบ Association ให้เป็ น Table ทีสั
 One-to-One
Association
้
- ออกแบบ Table ของ Class ทังสองข
า้ งของ
่
เครืองหมาย
Association
-ให้เลือกเอา Primary Key ของ Table ตัวใดก็ได ้ไป
เป็ น Foreign Key ของอีก Table หนึ ง่
-การใส่ Foreign Key ให้พจิ ารณาว่า Table ทีถู่ ก
้ มี Minimum Cardinality เป็ นอะไร เช่น ถา้ เป็ น
อ ้างถึงนัน
0..1 Foreign Key จะเป็ นค่าว่างได ้ แต่ถา้ กลับกัน เป็ น 1..1
Foreign Key จะเป็ นค่าว่างไม่ได ้
ตัวอ
ย่าง
Man
0..1
CREATE TABLE MAN
( MANID
CHAR(10)
NOT NULL,
WOMANID CHAR(10),
PRIMARY KEY = MANID,
FOREIGN KEY = WOMANID
REFERENCES WOMAN)
Marr
ies
0..1
Wom
an
CREATE TABLE WOMAN
( WOMANID CHAR(10) NOT
NULL,
PRIMARY KEY = WOMANID)
ตัวอ
ย่าง
Office
1..1
CREATE TABLE OFFICE
( OFFICEID
CHAR(10)
NOT NULL,
PRIMARY KEY =
OFFICEID)
Man
age
1..1
Manag
er
CREATE TABLE MANAGER
( MANGID
CHAR(10)
NOT NULL,
OFFICEID
CHAR(10)
NOT NULL,
PRIMARY KEY = MANGID,
FOREIGN KEY = OFFICEID
REFERENCES OFFICE)
 One-to-Many
Association
ห ลั กใ น ก า ร ส ร ้า ง Table จ า ก One-to-Many
้ มี ห ลัก การเดีย วกัน กับ การสร า้ ง Table
Association นั น
จาก Aggregation Abstraction โดย Table ในดา้ น
One จะเหมือนกับ Table ของ Main Class หรือ
Aggregation Association และ Table ในด ้าน Many จะ
เหมือนกับ Table
ของ Composite
Class
ใน
่ อใหน้ าเอา Primary Key ของ Table
Aggregation นันคื
ในด ้าน One ไปเป็ น Foreign Key ของ Table ในดา้ น
Many
ตัวอ
ย่าง
Teache
r
1..1
CREATE TABLE TEACHER
( TCHID
CHAR(10) NOT
NULL,
PRIMARY KEY = TCHID)
Teac
h
0..n
Student
CREATE TABLE STUDENT
( STDID
CHAR(10) NOT
NULL,
TCHID
CHAR(10)
NOT NULL,
PRIMARY KEY = STDID,
FOREIGN KEY = TCHID
REFERENCES TEACHER)
 Many-to-Many
Association
้
-สร ้าง Table
ของ Class
ทังสองข
า้ งของ
Association
-สร ้าง Table อีกหนึ ง่ Table ทีมี่ อย่างน้อย 2
่ คอื Primary Key ของ
้
Column ซึงก็
Table ทังสอง
้
และให้ Column ทังหมดเป็
น Key ของ Table ดังกล่าว
่
ซึงจะเรี
ยกว่าเป็ น Association Table
่
่ น Primary
-ใหส้ ่วนหนึ งของ
Primary Key ทีเป็
่ น Foreign Key อ ้างอิง
Key ของ Table ขา้ งใดขา้ งหนึ งเป็
้
ไปยัง Table นันๆ
ตัวอ
ย่าง
Subject
0..n
CREATE TABLE SUBJECT
( SUBID
CHAR(10)
NOT NULL,
PRIMARY KEY = SUBID )
Teac
h
0..n
Student
CREATE TABLE STUDENT
( STDIDCHAR(10) NOT
NULL,
PRIMARY KEY = STDID )
CREATE TABLE STD_SUB
( STDIDCHAR(10),
SUBID
CHAR(10),
PRIMARY KEY = (STDID, SUBID),
FOREIGN KEY = STDID REFERENCES
STUDENT,
FOREIGN KEY = SUBID REFERENCES
SUBJECT )
่ ความสัมพันธ ์กัน
16.2.4 หลักการแปลง Class ทีมี
่ มพันธ ์กัน
แบบ Generalization ให้เป็ น Table ทีสั
ตั ว อ ย่ า ง 1 ก า ร ส ร ้ า ง
Table
จากข้
ความ
“นั
กเรียนทุ
กๆ อ
คน
จะตอ้ งเขา้ อยู่ในชมรมฟุตบอล หรือ
ชมรมเทนนิ ส หรืออาจจะอยูท
่ งั ้ 2 ชมรมเลยก็ได ้”
เ ป็ น ตั ว อ ย่ า ง ข อ ง Generalization แ บ บ Total่
Overlapping ซึงสามารถสร
้าง Table โดยยึดหลักการการ
CREATE TABLE TENNIS
สร ้าง Table ดังนี ้
( TID
CHAR(10) NOT NULL,
CREATE TABLE STUDENT
( ID
CHAR(10) NOT
NULL,
NAME CHAR(50) NOT
NULL,
PRIMARY KEY ID
)
PRIMARY KEY TID,
FOREIGN KEY TID
REFERENCES STUDENT
)
CREATE TABLE SOCCER
( SID
CHAR(10) NOT NULL,
PRIMARY KEY SID,
FOREIGN KEY SID
REFERENCES STUDENT
)
ตั ว อ ย่ า ง 2 ก า ร ส ร ้ า ง
Table จากข้อความ
“ในภาควิชาภาษาต่างประเทศ นักศึกษาทุกคนจะตอ้ ง
้ จะเลือก
เลือกเรียน ภาษาอังกฤษ หรือภาษาเยอรมันเท่านั น
้
เรียนทังสองภาษาไม่
เ ป็ น ตั ว อ ย่ าได
ง ข้” อ ง Generalization แ บ บ Total่
Exclusive ซึงสามารถสร
้าง Table โดยยึดหลักการการสร ้าง
Table ดังนี ้
CREATE TABLE STUDENT
CREATE TABLE LANGUAGE
( LID
CHAR(10) NOT
NULL,
PRIMARY KEY LID
)
CREATE TABLE FRENCH
( FID
CHAR(10) NOT NULL,
PRIMARY KEY FID,
FOREIGN KEY FID REFERENCES
LANGUAGE
)
( ID
CHAR(10) NOT NULL,
NAME CHAR(50) NOT NULL,
PRIMARY KEY ID,
FOREIGN KEY ID REFERENCES
LANGUAGE
)
CREATE TABLE GERMAN
( GID
CHAR(10) NOT NULL,
PRIMARY KEY GID,
FOREIGN KEY GID REFERENCES
LANGUAGE
)
ตั ว อ ย่ า ง 3 ก า ร ส ร ้ า ง
Table จากข้อความ
“นั กเรียนบางคนเป็ นนั กกีฬา นั กเรียนบางคนเป็ นนั ก
้
ดนตรี แต่ไม่มน
ี ักเรียนคนใดเป็ นได ้ทังสองอย่
าง แต่ก็มน
ี ักเรียน
่ เป็ นทังสองอย่
้
บางคนที
ไม่
เป็ นตั ว อย่ า งของาง”Generalization แบบ Partial่
Exclusive ซึงสามารถสร
้าง Table โดยยึดหลักการการสร ้าง
CREATE TABLE STUDENT
Table ดังนี ้
( ID
CHAR(10) NOT NULL,
CREATE TABLE CLUB
( CID
CHAR(10) NOT
NULL,
PRIMARY KEY CID
)
CREATE TABLE SPORT
( SID
CHAR(10) NOT NULL,
PRIMARY KEY SID,
FOREIGN KEY SID REFERENCES
CLUB
)
SID
CHAR(10),
NAME CHAR(50) NOT NULL,
PRIMARY KEY ID,
FOREIGN KEY SID
REFERENCES CLUB
)
CREATE TABLE MUSIC
( MID
CHAR(10) NOT NULL,
PRIMARY KEY MID,
FOREIGN KEY MID REFERENCES
CLUB
)
ตั ว อ ย่ า ง 4 ก า ร ส ร ้ า ง
Table จากข้อความ
“นั ก เรีย นบางคนเป็ นชาย นั ก เรีย นชายบางคนเป็ น
หัวหน้าห้อง แต่หวั หน้าห้องบางคนอาจไม่ใช่นักเรียนชาย และ
่ ใช่นักเรียนชายและไม่ ไดเ้ ป็ น
ก็มีนักเรียนอีกหลายๆ คนทีไม่
นตั ว อย่ า งของ Generalization แบบ Partialหัวหน้าเป็
ห้อง”
่
Overlapping ซึงสามารถสร
้าง Table โดยยึดหลักการการ
สร ้าง Table ดังนี ้
CREATE TABLE STUDENT
CREATE TABLE MALE
( MID
CHAR(10) NOT NULL,
PRIMARY KEY MID,
FOREIGN KEY MID REFERENCES
STUDENT
)
( ID
CHAR(10) NOT NULL,
PRIMARY KEY ID,
)
CREATE TABLE HEAD
( HID
CHAR(10) NOT NULL,
PRIMARY KEY HID,
FOREIGN KEY HID REFERENCES
STUDENT
)
คาถาม
ท้ายบท
จงออกแบบ Class Diagram และสร ้าง Relational
Database จาก
Problemให้Domain
ต่อไปนี ้
หมายเหตุ
กาหนด Primary
key และ
Foreign Key ด ้วยตัวเอง
Problem
่
Domain“สวนสัตว ์เปิ ดแห่งหนึ งประกอบไปด
ว้ ยเขตของสวน
สัตว ์ 6 เขตคือ เขตสัตว ์ป่ าแอฟริกา เขตสัตว ์ป่ าเอเชีย เขต
ั ษณะแปลก เขตการแสดง
สัตว ์เมืองหนาว เขตสัตว ์ทีมี่ ลก
เขตโรงพยาบาลสัตว ์ (สาหรับสัตว ์ทีป่่ วยหรือเป็ นโรค) ในแต่
่
ละส่วนจะประกอบไปดว้ ยสัตว ์นานาชนิ ด ซึงอาจจะมี
ทงสั
ั ้ ตว ์
่
่ า้ เป็ นตน้ ตามปกติแลว้ สัตว ์
บก สัตว ์นา้ สัตว ์ครึงบกครึ
งน
้ แต่ใ นบางกรณี
หนึ ่งชนิ ด จะอยู่ ใ นเขตใดเขตหนึ ่งเท่ า นั น
่
อาจจะมีการโยกยา้ ยสัตว ์เพือความเหมาะสม
เช่น อาจจะมี
่
การโยกย า้ ยสัต ว จ์ ากเขตอืนมาอยู
่ ใ นเขตการแสดง หรือ