Chapter 16 Persistent Data Design หรือ Database Design โดยใช้ Relational Database
Chapter 16 Persistent Data Design หรือ Database Design โดยใช้ Relational Database. จุดประสงค์ 1. เพื่อให้นักศึกษาเข้าใจในกระบวนการในการออกแบบเพื่อการเก็บข้อมูลของ Class ต่างๆ ไว้อย่างถาวรได้
Chapter 16 Persistent Data Design หรือ Database Design โดยใช้ Relational Database
E N D
Presentation Transcript
Chapter 16 Persistent Data Design หรือ Database Design โดยใช้ Relational Database
จุดประสงค์ 1. เพื่อให้นักศึกษาเข้าใจในกระบวนการในการออกแบบเพื่อการเก็บข้อมูลของ Class ต่างๆ ไว้อย่างถาวรได้ 2. เพื่อให้นักศึกษาเข้าใจความสัมพันธ์และการแปลงระหว่าง Class กับ Relational Database
16.1 Relational Database Relational Database คือระบบฐานข้อมูลที่อาศัย Relation หรือตาราง (Table) เพื่อแสดงค่าและความสัมพันธ์ของข้อมูล ข้อมูลที่เก็บอยู่ในแต่ละช่องของ Table เรียกว่า Data Item ในทาง Relational Database แต่ละกลุ่มของ Data Item จะมีชื่อของตนเอง เรียกชื่อนั้นว่า Field Name หรือ Column Name กลุ่มของข้อมูลที่มี Column Name เหมือนกัน เรียกว่า Column และเมื่อนำ Column หลายๆ Column ที่แตกต่างกันมาเรียงต่อกันจะได้ Tuple หรือ Row ของข้อมูล และ Row หลายๆ Row เมื่อรวมกันจะได้ Table และเมื่อนำเอา Table ที่มีความสัมพันธ์กันมารวมกันจะได้ฐานข้อมูล (Database) นั่นเอง
Field Name Data Item Table Row Column รูป โครงสร้างของ Table ใน Relational Database ในแต่ละ Row ของ Database จะเป็นกลุ่มของ Data Item ที่บ่งชี้ถึง Entry หรือกลุ่มของ Attributes ของ Object แต่ละตัว ดังนั้นในแต่ละ Row จะต้องมี Data Item อย่างน้อย 1 ตัวที่จะเป็นตัวบ่งชี้ (Identity) ว่า Row นั้นบรรจุข้อมูลที่ต่าง Row กัน กล่าวคือ จะต้องเลือกเอา Column อย่างน้อย 1 Column มาเป็นตัวบ่งชี้ดังกล่าว ซึ่งตัวบ่งชี้ของ Row ใด Row หนึ่ง จะต้องไม่ซ้ำกับตัวบ่งชี้ของ Row อื่น และเรียก Column ที่เป็นตัวบ่งชี้นั้นว่า Key หรือ Primary Key ตัวอย่างเช่น คนไทยมีหมายเลขบัตรประชาชน เป็น Primary Key เพราะหมายเลขบัตรประชาชนของคนไทยแต่ละคน ไม่มีทางซ้ำกันได้เลย
ในขณะเดียวกัน เมื่อต้องการที่จะแสดงความสัมพันธ์ระหว่างTable หนึ่งกับอีก Table หนึ่ง สิ่งที่จำเป็นต้องมีคือ ข้อมูลสักตัวหนึ่งที่จะสามารถบ่งชี้ถึงความสัมพันธ์ระหว่าง 2 Table ได้ ซึ่งในหลักการของ Relational Database นั้น จะใช้การอ้างอิง (Reference) เพื่อบ่งชี้ความสัมพันธ์ระหว่าง 2 Table สิ่งที่ใช้เพื่อการอ้างอิงนี้เรียกว่า Foreign Key ซึ่งหมายถึง Column หนึ่งใน Table ที่จะเก็บ Primary Key ของอีก Table หนึ่งไว้เพื่อใช้ในการอ้างถึง หรือแสดงความสัมพันธ์ Table Name: Person Foreign Key Table Name: Province Primary Key รูป Primary Key และ Foreign Key
จากรูปเป็นภาพแสดง ตัวอย่างของ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 ใด Class หนึ่งใน Class Diagram นั้น ต้องมีความสัมพันธ์กันในรูปแบบใดรูปแบบหนึ่ง (Aggregation, Generalization หรือ Association) กับ Class อื่นอย่างน้อย 1 Class เสมอ ดังนั้นการออกแบบ Relational Database เพื่อเก็บข้อมูล (หรือ Attributes) ของ Class ต่างๆ จึงจำเป็นต้อง แสดงความสัมพันธ์ของ Table เช่นเดียวกัน ใน Relational Database นั้น สิ่งที่ใช้เพื่อเชื่อมความสัมพันธ์ระหว่าง Table ก็คือ Foreign Key นั่นเอง
16.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, FOREIGN KEY JOB REFERENCES JOB_DB ) ตัวอย่างนี้ เป็นประโยคในการสร้างTable ที่ชื่อ Person ซึ่งมีข้อมูลหรือ Column ต่างๆ ดังนี้
Id ใช้เพื่อเก็บหมายเลขประจำตัวของบุคคลId ใช้เพื่อเก็บหมายเลขประจำตัวของบุคคล • -Name ใช้เพื่อเก็บชื่อของบุคคล • -Sex, Age, Height ใช้เพื่อเก็บ เพศ อายุ และ ส่วนสูง ของบุคคล • -Char(n) หมายถึง การกำหนดชนิดและขนาดของข้อมูล ให้เป็น ตัวอักษรที่มีขนาด n เช่น Id Char(10) หมายถึงให้ Column Id มีชนิดเป็นตัวอักษร ซึ่งมีความยาวได้สูงสุด 10 ตัวอักษร • -Integer และ Real หมายถึง การกำหนดชนิดของข้อมูลให้เป็น จำนวนเต็มและ จำนวนจริง ตามลำดับ การมีวลีNot Null อยู่ท้าย 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 ต่างๆ เท่านั้น
Officer -Officer_Id -Office_Id -Officer_Name -Gender -Salary -Page_no +Get_Id() +Get_Name() +Set_Id() +Set_Name() +Get_Page_No() +Set_Page_No() +Get_Salary() +Set_Salary() +Get_Gender() ตัวอย่าง 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 ใน Relational Database นั้น ให้นำเอา Primary Key (อาจจะเป็น Field เดียวหรือกลุ่มของ Field ก็ได้) ของ Main Class มาเป็น Foreign Key ของ Composite Class ซึ่งก็เหมือนกับการเอาชื่อของพ่อแม่ไปเก็บไว้ที่ลูก เมื่อพ่อแม่พาลูกออกไปเที่ยว เวลาที่ลูกสูญหาย ตำรวจจะได้ทราบพ่อแม่คือใคร แต่ถ้าหากปฏิบัติในทางกลับกันตำรวจจะไม่สามารถตามหาลูกที่สูญหายได้
ในการใส่Foreign Key เข้าไปยัง Composite Class นั้น ต้องพิจารณาด้วยว่า Foreign Key นั้นเป็นค่า Null ได้หรือไม่ โดยดูจาก Minimal Cardinality เช่น ถ้าหาก Cardinality ที่ฝั่ง Composite Class เป็น 0..n แสดงว่า Main Class มีสิทธิ์ที่จะไม่ต้องมี Composite Class ประกอบอยู่เลยก็ได้ ดังนั้น Foreign Key ตัวนี้สามารถเป็น Null ได้ แต่ในทางกลับกัน หากว่า Cardinality ที่ฝั่ง Composite Class เป็น 1..n นั่นหมายความว่า ในทุกๆ ช่วงเวลาจะต้องมี Composite Class ประกอบอยู่ใน Main Class เสมอ ดังนั้น Foreign Key ตัวนี้ไม่มีสิทธิ์เป็น Null ได้เลย
Officer Office Department -Officer_Id -Office_Id -Office_Name -Gender -Salary -Phone_No -Office_Id -Office_Name -Phone_No -Dept_Id -Dept_Name ตัวอย่าง +Get_Id() +Set_Id() +Get_Name() +Set_Name() 1..n +Get_Id() +Set_Id() +Get_Name() +Set_Name() +Get_Phone_No() +Set_Phone_No() 0..n +Get_Id() +Set_Id() +Get_Name() +Set_Name() +Get_Page_No() +Set_Page_No() +Get_Salary() +Set_Salary() +Get_Gender() 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), Primary Key = Officer_Id, Foreign Key Office_Id References Office ) จะได้ Table อย่างไร...!
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 จะเป็นค่าว่างไม่ได้
ตัวอย่าง Marries Man 0..1 0..1 Woman CREATE TABLE MAN ( MANID CHAR(10) NOT NULL, WOMANID CHAR(10), PRIMARY KEY = MANID, FOREIGN KEY = WOMANID REFERENCES WOMAN) CREATE TABLE WOMAN ( WOMANID CHAR(10) NOT NULL, PRIMARY KEY = WOMANID)
ตัวอย่าง Manage Office 1..1 1..1 Manager CREATE TABLE MANAGER ( MANGID CHAR(10) NOT NULL, OFFICEID CHAR(10) NOT NULL, PRIMARY KEY = MANGID, FOREIGN KEY = OFFICEID REFERENCES OFFICE) CREATE TABLE OFFICE ( OFFICEID CHAR(10) NOT NULL, PRIMARY KEY = OFFICEID)
One-to-Many Association หลักในการสร้างTable จาก One-to-Many Association นั้น มีหลักการเดียวกันกับการสร้าง Table จาก Aggregation Abstraction โดย Table ในด้าน One จะเหมือนกับ Table ของ Main Class หรือ Aggregation Association และ Table ในด้าน Many จะเหมือนกับ Table ของ Composite Class ใน Aggregation นั่นคือให้นำเอา Primary Key ของ Table ในด้าน One ไปเป็น Foreign Key ของ Table ในด้าน Many
ตัวอย่าง Teach Teacher 1..1 0..n Student CREATE TABLE STUDENT ( STDID CHAR(10) NOT NULL, TCHID CHAR(10) NOT NULL, PRIMARY KEY = STDID, FOREIGN KEY = TCHID REFERENCES TEACHER) CREATE TABLE TEACHER ( TCHID CHAR(10) NOT NULL, PRIMARY KEY = TCHID)
Many-to-Many Association -สร้าง Table ของ Class ทั้งสองข้างของ Association -สร้าง Table อีกหนึ่ง Table ที่มีอย่างน้อย 2 Column ซึ่งก็คือ Primary Key ของ Table ทั้งสอง และให้ Column ทั้งหมดเป็น Key ของ Table ดังกล่าว ซึ่งจะเรียกว่าเป็น Association Table -ให้ส่วนหนึ่งของ Primary Key ที่เป็น Primary Key ของ Table ข้างใดข้างหนึ่งเป็น Foreign Key อ้างอิงไปยัง Table นั้นๆ
Teach Subject 0..n 0..n Student CREATE TABLE STUDENT ( STDID CHAR(10) NOT NULL, PRIMARY KEY = STDID ) CREATE TABLE SUBJECT ( SUBID CHAR(10) NOT NULL, PRIMARY KEY = SUBID ) CREATE TABLE STD_SUB ( STDID CHAR(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 โดยยึดหลักการการสร้าง Table ดังนี้ CREATE TABLE TENNIS ( TID CHAR(10) NOT NULL, PRIMARY KEY TID, FOREIGN KEY TID REFERENCES STUDENT ) CREATE TABLE STUDENT ( ID CHAR(10) NOT NULL, NAME CHAR(50) NOT NULL, PRIMARY KEY ID ) 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 ( ID CHAR(10) NOT NULL, NAME CHAR(50) NOT NULL, PRIMARY KEY ID, FOREIGN KEY ID REFERENCES LANGUAGE ) 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 ) CREATE TABLE GERMAN ( GID CHAR(10) NOT NULL, PRIMARY KEY GID, FOREIGN KEY GID REFERENCES LANGUAGE )
ตัวอย่าง 3 การสร้างTable จากข้อความ “นักเรียนบางคนเป็นนักกีฬา นักเรียนบางคนเป็นนักดนตรี แต่ไม่มีนักเรียนคนใดเป็นได้ทั้งสองอย่าง แต่ก็มีนักเรียนบางคนที่ไม่เป็นทั้งสองอย่าง” เป็นตัวอย่างของGeneralization แบบ Partial-Exclusive ซึ่งสามารถสร้าง Table โดยยึดหลักการการสร้าง Table ดังนี้ CREATE TABLE STUDENT ( ID CHAR(10) NOT NULL, SID CHAR(10), NAME CHAR(50) NOT NULL, PRIMARY KEY ID, FOREIGN KEY SID REFERENCES CLUB ) 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 ) 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 ( ID CHAR(10) NOT NULL, PRIMARY KEY ID, ) CREATE TABLE MALE ( MID CHAR(10) NOT NULL, PRIMARY KEY MID, FOREIGN KEY MID REFERENCES STUDENT ) 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 เขตคือ เขตสัตว์ป่าแอฟริกา เขตสัตว์ป่าเอเชีย เขตสัตว์เมืองหนาว เขตสัตว์ที่มีลักษณะแปลก เขตการแสดง เขตโรงพยาบาลสัตว์ (สำหรับสัตว์ที่ป่วยหรือเป็นโรค) ในแต่ละส่วนจะประกอบไปด้วยสัตว์นานาชนิด ซึ่งอาจจะมีทั้งสัตว์บก สัตว์น้ำ สัตว์ครึ่งบกครึ่งน้ำ เป็นต้น ตามปกติแล้ว สัตว์หนึ่งชนิดจะอยู่ในเขตใดเขตหนึ่งเท่านั้น แต่ในบางกรณีอาจจะมีการโยกย้ายสัตว์เพื่อความเหมาะสม เช่น อาจจะมีการโยกย้ายสัตว์จากเขตอื่นมาอยู่ในเขตการแสดง หรือโยกย้ายสัตว์ที่ป่วยมาไว้ในเขตโรงพยาบาลสัตว์ เป็นต้น”