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 เขตคือ เขตสัตว ์ป่ าแอฟริกา เขตสัตว ์ป่ าเอเชีย เขต ั ษณะแปลก เขตการแสดง สัตว ์เมืองหนาว เขตสัตว ์ทีมี่ ลก เขตโรงพยาบาลสัตว ์ (สาหรับสัตว ์ทีป่่ วยหรือเป็ นโรค) ในแต่ ่ ละส่วนจะประกอบไปดว้ ยสัตว ์นานาชนิ ด ซึงอาจจะมี ทงสั ั ้ ตว ์ ่ ่ า้ เป็ นตน้ ตามปกติแลว้ สัตว ์ บก สัตว ์นา้ สัตว ์ครึงบกครึ งน ้ แต่ใ นบางกรณี หนึ ่งชนิ ด จะอยู่ ใ นเขตใดเขตหนึ ่งเท่ า นั น ่ อาจจะมีการโยกยา้ ยสัตว ์เพือความเหมาะสม เช่น อาจจะมี ่ การโยกย า้ ยสัต ว จ์ ากเขตอืนมาอยู ่ ใ นเขตการแสดง หรือ