บทที่7 Project การสร้างฐานข้อมูลขนาดย่อม

      การออกแบบฐานข้อมูล (Database Design)ฐานข้อมูลเป็นเรื่องสำคัญสำหรับระบบงานสารสนเทศที่ใช้ใคอมพิวเตอร์ประมวลผลในปัจจุบัน ในการออกแบบระบบสารสนเทศปัจจุบันก็มีการพัฒนาเทคโนโลยีกันอย่างมากมายโดยจะมีระบบการออกแบบที่เป็นที่นิยมใช้กันมากในปัจจุบันเรียกว่า Relational Modelโดยมีโปรแกรมที่คุณจะศึกษาหรือโปรแกรม MS Access นี้เป็นตัวช่วยในการออกแบบและสร้างฐานข้อมูล ถือว่าเป็น Tool ที่นิยมใช้กันในปัจจุบัน 

ฐานข้อมูลแบบสัมพันธ์(Relational Database) หนึ่งฐานข้อมูล สามารถบรรจุได้หลายตาราง จึงทำให้เกิดคำถามว่า ควรจะมีตารางเป็นจำนวนเท่าใด

และมีฟิลด์อะไรบ้างที่อยู่ในแต่ละตาราง คำตอบที่จะได้เป็นพื้นฐานในการออกแบบฐานข้อมูล การออกแบบที่ดีจะทำให้ฐานข้อมูลง่ายต่อการใช้งาน และมีความยืดหยุ่น 

เช่นเดียวกับหลายๆ สิ่งในชีวิต ในการออกแบบฐานข้อมูลเป็นทั้งศาสตร์และศิลป์ หมายความว่า คุณสามารถออกแบบฐานข้อมูลได้ทั้งแบบอย่างไม่มีแบบแผน

โดยใช้ประสบการณ์ หรือจะใช้การออกแบบอย่างมีแบบแผนก็แล้วแต่ แต่การขบคิดอย่างไม่มีแบบแผน(Informal) มักจะเป็นวิธีการอันดับแรกที่ใช้กัน
การออกแบบอย่างไม่เป็นแบบแผน (Informal Design Database)

รายละเอียดตามขั้นตอนต่อไปนี้ จะพูดถึงแต่ละขั้นตอน ซึ่งวิธีการนี้จะใช้ในการออกแบบฐานข้อมูลให้ใช้งานได้ และนักออกแบบฐานข้อมูลมักใช้ในการเริ่มการออกแบบในงานจริง แต่สำหรับการออกแบบอย่างมีหลักการนั้นจะใช้ไว้ตรวจสอบการออกแบบอย่างไม่มีแบบแผนมากกว่าที่จะใช้ในการเริ่มต้นการออกแบบ 

1. กำหนดกลุ่มข้อมูลที่จะจัดเก็บหลักในโปรแกรมประยุกต์ขึ้นมา
ในทุกโปรแกรมประยุกต์จะเกี่ยวข้องกับ จำนวน Entities ที่เป็นหัวเรื่องที่เกี่ยวข้องกัน, คุณสมบัติและความสัมพันธ์ของ Entity เป็นพื้นฐานไปสู่โปรแกรมประยุกต์ นี่เป็นตัวอย่างบางส่วน
• งานระบบบันทึกเวลาในห้องเรียน มี อาจารย์, นักเรียน, ห้องเรียน, หลักสูตร, และ ภาคการเรียน
• งานระบบตั๋วเครื่องบิน มี ลูกค้า, กลุ่มสมาชิก, ไฟลท์, เครื่องบิน, ที่นั่ง, สนามบิน, ประตูทางเข้า
• กลุ่มกีฬา มี ผู้เล่น, ทีม, สถานที่แข่ง, ตารางการแข่งขัน, สถิติการแข่งขัน, ผู้ฝึกนักกีฬา, กรรมการผู้ตัดสิน
• ระบบการสั่งซื้อ มี ลูกค้า, ใบสั่งซื้อ, รายการการสั่งซื้อ, บิลของจำนวนการส่ง, จำนวนการส่งของแต่ละรายการ, ใบส่งของลูกค้า, รายการของใบส่งของลูกค้า, รายการในสต็อก, คลังสินค้า, ผู้จัดส่ง, ใบจัดซื้อ, รายการในใบจัดซื้อ, ใบรับสินค้า, รายการของใบรับสินค้า, ใบผู้จัดซื้อ, รายการของผู้จัดซื้อ
“คุณลองนึกระบบงานขึ้นมาสักระบบงานหนึ่ง แล้วลองนำว่าสิ่งที่จะต้องจัดเก็บมีอะไรบ้าง เก็บเพื่อเอาไปใช้งานอะไร มีประโยชน์อะไรกับระบบ” 

2. การสร้างตารางสำหรับแต่ละกลุ่มข้อมูลที่จะจัดเก็บ
ขั้นต่อไปเริ่มต้นสร้างตารางสำหรับ Entities หลัก ในโปรแกรมประยุกต์ของคุณ คุณสามารถทำในกระดาษ ,ในแฟ้มอิเล็คทรอนิคใดก็ได้ หรือใน DBMS ได้แก่ Access หรือ SQL Server ในจุดนี้ก็ไม่สำคัญนัก แต่คุณควรกำหนดให้ในตารางแต่ละตารางมีชื่อสั้นๆ ง่ายต่อการจำและการเรียก ตัวอย่าง เช่น ถ้าคุณสร้างตารางกำหนดและบรรยาย ตารางข้อมูลสินค้า ที่ไว้ขาย คุณอาจจะให้ชื่อว่า Products 

3. เลือกคีย์ที่ใช้เป็นคีย์หลัก
ตอนนี้ สำหรับแต่ละตารางของคุณที่ได้ถูกสร้างขึ้นมา ให้กำหนดฟิลด์ฟิลด์หนึ่ง หรือมากกว่า ในการบ่งบอกเป็นเอกลักษณ์ของแต่ละ Record ในตาราง เรียกฟิลด์ดังกล่าวของตารางนั้น ว่า คีย์หลัก หรือ Primary key โดยกำหนดว่าฟิลด์ที่เป็น Primary key นั้นไม่สามารถว่างได้ และข้อมูลที่อยู่ในฟิลด์ที่เป็น Primary key ของทุก ๆ Record จะต้องไม่ซ้ำกัน หากมีการร้องขอข้อมูลโดยระบุค่าของ Primary key ไปจะต้องได้ข้อมูลที่มี Primary Key นั้นเพียง 1 Record เท่านั้นจะเกิน 1 Record ไม่ได้.
คอมพิวเตอร์จะไม่สนใจหรอกว่าคุณกำหนด คีย์ ให้กับ ฟิลด์ใด แต่คนเราต้อง ทราบเองและสร้างมันขึ้นมาเอง ดังนั้น จะให้ดีที่สุดหากเราจะบ่งบอก Entity ด้วย Natural key. โดยNatural key เป็น คีย์ ที่มีการสร้างขึ้นอยู่แล้วบนโลกนี้โดยมนุษย์ใช้ในการกำหนดค่าให้กับ entity ยกตัวอย่างเช่น อาจจะบ่งบอกหนังสือแต่ละเล่มในตาราง Book ด้วย International Standard Book Number (ISBN) มากกว่าที่เราจะสร้างรหัสขึ้นมาใหม่
บาง Natural key เป็น Key ที่ทำให้ key ของฐานข้อมูลไม่สมบูรณ์ ,อาจจะยาวไป หรือ คีย์ ที่มีช่องว่าง หรือ เครื่องหมายวรรคตอน ถ้า Natural key มีข้อบกพร่องอย่างน้อยหนึ่งข้อดังที่กล่าวมาแล้ว คุณควรสร้าง คีย์ ใหม่ให้เหมาะสมด้วยตัวคุณเอง ตัวอย่างเช่น มีระบบหนึ่งที่จัดการเกี่ยวกับ ร้านทำผม ไม่เหมาะที่จะบ่งบอก ด้วยชื่อร้าน เช่น Cut & Curl , Chalachorn และ Duelเพราะสิ่งนั้นจะยากในการที่จะสะกดได้ถูกหากสะกดผิดเครื่องย่อมเข้าใจว่าเป็นคนละร้าน จึงควรที่จะกำหนด รหัสร้าน ในลักษณะเช่น 1,2,3 จะง่ายและผิดพลาดน้อยกว่า 

4. การเพิ่มหัวข้อของข้อมูลให้กับตารางหลักแต่ละตาราง
มาเริ่มต้นขั้นตอนนี้กัน ด้วยแนวคิดเกี่ยวกับข้อมูลของโปรแกรมประยุกต์ที่ต้องการรู้ข้อมูลใน entity หลักแต่ละตัว ที่คุณได้กำหนดไว้(หมายถึงในแต่ละตาราง) ตาราง customers อาจจะมีฟิลด์ customer number, name, street address, city, state, country, postal code, e-mail address, phone number, fax number เป็นต้น
การระบุฟิลด์ที่จำเป็นในโปรแกรมประยุกต์ของคุณนั้นไม่ใช่จุดสำคัญที่สุด แต่ในไม่ช้าคุณก็ต้องกำหนด ซึ่งมันไม่ยากเลยในการที่จะเพิ่มมันลงไปในการออกแบบฐานข้อมูลของคุณ .ถ้าโปรแกรมประยุกต์เกี่ยวพันไปถึงการพิมพ์เป็นแบบฟอร์ม คุณอาจจะรู้ว่าฟิลด์ใดที่คุณต้องการ โดยดูได้จากฟอร์มนั้นในความเป็นจริง ลักษณะของข้อมูลต่าง ๆ จะใช้ในวัตถุประสงค์ใกล้เคียงกัน
คุณควรคาดเดาได้ด้วยว่า ทุกโปรแกรมประยุกต์จะต้องมีตารางที่เกี่ยวข้องกันด้วยกันหลาย ๆ ตารางและมีฟิลด์ที่แตกต่างกันด้วยในแต่ละตาราง ซึ่งเป็นหลักการทั่วไปในการออกแบบฐานข้อมูลที่เหมาะสมสำหรับทุกโปรแกรมประยุกต์ 

5. การสร้างตารางเพิ่มเติมสำหรับ attribute ที่ซ้ำ ๆ กัน
ขณะที่คุณเพิ่ม attributes ของ entity คุณอาจจะพบว่า ในแต่ละ primary key อาจมี attribute ได้มากกกว่าหนึ่ง ตัวอย่างเช่น คุณอาจจะพบว่า ห้องเรียนหนึ่งห้องอาจจะมีผู้สอนได้หลายคน ในระบบงานโฆษณา 1 งาน มีเอเจนซี่ได้หลายคน
การแก้ปัญหาอย่างหนึ่ง แม้จะไม่สมบูรณ์นัก คือการกำหนดฟิลด์ในตาราง members ขึ้นมาใหม่ ได้แก่ committee1, committee2, committee3 อย่างไรก็ตาม การแก้ปัญหาดังกล่าว มีปัญหาเกิดขึ้นได้ 3 ประการ 

1. ฟิลด์ committee ที่สร้างขึ้นนั้นอาจว่างได้ ในบาง record ของตาราง members ฟิลด์ที่ว่าง ชี้ให้เห็นว่า จัดการบางสิ่งได้ไม่ถูกต้อง 

2. การที่มีฟิลด์ committee หลายฟิลด์ใน record เดียวกันนั้นทำให้ยากต่อการ select, project และ join ด้วยฟิลด์ committee คุณควรจะใช้ฟิลด์ไหน ในฟิลด์ committee 3 ฟิลด์นี้ และจะถูกเก็บในลักษณะใด

3. ถ้า member บาง record มีกรรมการ 4 คนจะทำอย่างไร กับ committee ที่4 ล่ะ (ฐานข้อมูลจะไม่เหมาะแล้วเพราะกำหนดตอนแรกไว้ 3 ฟิลด์)
การแก้ปัญหาที่ดีกว่า คือ การสร้างตาราง committee membership ซึ่งบรรจุด้วย record หนึ่ง สำหรับแต่ละสมาชิก อีกฟิลด์หนึ่งสำหรับแต่ละ committee ดังนั้นตารางที่ได้อาจจะมี primary key ได้ 2 ฟิลด์ คือ committee และ memberid การออกแบบเช่นนี้เป็นการยืดหยุ่น เพราะว่าสนับสนุนแนวคิดที่ว่า สมาชิก 1 คน มีกรรมการได้ตั้งแต่ 0 คนจนถึง หลายคน และ กรรมการ 0 คนถึงหลายคนมีสมาชิกได้หลายคน หากมีข้อมูลที่เกี่ยวข้องกับสมาชิกกับกรรมการโดยเฉพาะ เช่นวันที่เข้าร่วม ก็จะสามารถจัดการข้อมูลได้ง่าย 

6. ต้องแน่ใจว่าแต่ละฟิลด์นั้นได้กำหนดคีย์หลักเหมาะสมแล้ว
การออกแบบในขั้นตอนนี้ คุณควรจะทบทวนแต่ละฟิลด์ในแต่ละตาราง และตรวจสอบฟิลด์ที่เป็น Primary key ของตารางนั้นเหมาะที่จะเป็น primary key หรือไม่ มาดูกันว่า จะตรวจสอบได้อย่างไร อันดับแรกให้คุณออกแบบตาราง committee membership โดยมีฟิลด์ต่างๆ ดังนี้ ต่อจากนั้นเรามาเล่นเกมกัน “ฟิลด์ไหนเอ่ยที่ไม่ได้ขึ้นอยู่กับตารางนี้ ?” 

• Committee ID (primary key ฟิลด์แรก)
• Member ID (primary key ฟิลด์ที่2)
• Date Joined
• Committee Name 

ถ้าคุณเดาว่าฟิลด์ Committee name ไม่ได้ขึ้นอยู่กับตารางนี้ คุณเดาได้ถูกต้อง ฟิลด์Committee name ไม่ใช่คุณสมบัติของตาราง Committee membership แต่มันเป็นคุณสมบัติของตาราง Committee ดังนั้นมันจึงขึ้นอยู่กับตาราง Committees (ซึ่งฟิลด์ committeeid เท่านั้นที่เป็นprimary key ของตาราง committee)
หรือสังเกตได้อีกอย่างหนึ่งว่า ฟิลด์ committee name ไม่น่าจะอยู่ในตารางที่มีทั้งฟิลด์ committeeid และ ฟิลด์memberid ที่เป็น primary key ทั้งคู่ แต่ฟิลด์ committee name ควรจะอยู่ในตารางที่มี committeeid เป็น primary key เพียงฟิลด์เดียวก็เพียงพอแล้ว ดังนั้นฟิลด์ committee name ไม่ได้ขึ้นอยู่กับตารางที่มี primary key เป็น committeeid และ memberid
ถ้าคุณต้องการที่จะรู้ค่าของ committee name ซึ่งในตาราง committee members ไม่มี committee name คุณควรจะ join ตาราง committee member และ ตาราง committee table ด้วยฟิลด์ committeeid 

7. พิจารณาความสัมพันธ์ระหว่างตาราง
ในขั้นตอนสุดท้ายนี้ ทบทวนตารางทั้งหมดในฐานข้อมูลที่คุณสร้าง ระบบความสัมพันธ์ระหว่างตารางซึ่งคุณคิดไว้แล้วว่าจะมันมีความสัมพันธ์กันอย่างไร

หัวใจสำคัญ สำหรับขั้นตอนนี้คือ ตรวจสอบฟิลด์ของตารางที่คุณจะใช้ในการเชื่อมกัน ว่าจะเป็นฟิลด์ใดซึ่งโดยปกติแล้วคุณสามารถใช้ คีย์นั้นในการเชื่อมกันได้เลย
จดจำไว้ว่า คีย์ ที่ใช้ในการ join ไม่จำเป็นต้องมีชื่อเดียวกัน ในทางทฤษฎี คุณสามารถเชื่อมตารางด้วยฟิลด์ใดก็ได้ที่คุณต้องการ ในทางปฏิบัติเกือบทั้งหมด การเชื่อมระหว่างตาราง มักใช้ฟิลด์ที่ชื่อเหมือนกัน ตัวอย่าง employeeid ในตารางหนึ่ง เชื่อมกับ employeeid ของอีกตารางหนึ่ง แต่คงไม่ได้เรื่องเท่าไร หากจะเชื่อม 2 ตารางโดยฟิลด์ part numbers จากตารางหนึ่ง ไปยังฟิลด์ street addresses ของอีกตารางหนึ่ง

หากว่า 2 ฟิลด์ในตารางเป็นข้อมูลเดียวกันแล้วเรา ควรตั้งชื่อฟิลด์ให้เหมือนกัน การตั้งชื่อฟิลด์ Employeeid ในตารางหนึ่ง และตั้งชื่อ ฟิลด์ Employee num ในอีกตารางหนึ่งทั้งๆ ทีฟิลด์ดังกล่าวมีความหมายเหมือนกัน เป็นการสร้างความสับสนให้เราเปล่าๆ แม้ว่าฐานข้อมูลยังสามารถทำงานต่อไปได้




การออกแบบข้อมูลอย่างเป็นแบบแผน






สำหรับขั้นตอนของการออกแบบฐานข้อมูลแบบเป็นทางการให้กับฐานข้อมูลเชิงสัมพันธ์ซึ่งกระบวนการจัดการกับฟิลด์ให้กับตารางนั้นจะเรียกว่า นอร์มัลไลเซชั่น (Normalization) โดยจะมีขั้นตอนด้วยกัน 5 ขั้นดังต่อไปนี้ 

ระดับที่ 1 (First Normal Form)
หนึ่งฟิลด์ในหนึ่งเรคคอร์ดสามารถบรรจุค่าได้ 1 ค่าเท่านั้น สิ่งนี้จะป้องกันกลุ่มข้อมูลซ้ำในหนึ่งเรคคอร์ด 

ระดับที่ 2 (Second Normal Form)
ทุกๆ attribute ที่ไม่ใช่คีย์ ต้องขึ้นกับฟิลด์ทั้งหมดในคีย์หลัก ซึ่งยังระบุให้สองตารางหรือมากกว่าไม่สามารถใช้คีย์หลักที่เหมือนกันได้ ซึ่งหากเป็นเช่นนั้นคุณควรรวมเข้ามาเป็นตารางเดียวกัน 

ระดับที่ 3 (Third Normal Form)
ฟิลด์ที่ไม่ใช่คีย์จะต้องไม่ขึ้นกับฟิลด์ที่ไม่ใช่คีย์อื่นในตารางเดียวกัน 

ระดับที่ 4 (Forth Normal Form)
ห้ามไม่ให้มีความสัมพันธ์แบบหนึ่งต่อกลุ่ม (One-to-Many) ที่ไม่ขึ้นต่อกันระหว่างฟิลด์คีย์หลักและฟิลด์ที่ไม่ใช่คีย์ 

ระดับที่ 5 (Fifth Normal Form)
รูปแบบนี้ค่อนข้างยุ่งยากและมักจะถูกละเลย โดยจำเป็นต้องมีการแบ่งตารางออกเป็นชิ้นส่วนขนาดเล็กเพื่อขจัดความซ้ำซ้อนทั้งหมด

คุณอาจจะมองว่าการนอร์มัลไลเซชั่น (Normalization) เป็นเสมือนหลักการตรวจสอบมากกว่าวิธีปฏิบัติ เมื่อคุณทำการนอร์มัลไลซ์แล้วตารางตั้งต้นก็อาจจะถูกแตกออกมาเป็นตารางย่อยจำนวนมากก็ได้ ซึ่งจะมีประโยชน์ดังนี้
• ไม่มีความซ้ำซ้อน
• ดูแลรักษาง่าย
• สามารถเขียนโค้ดควบคุมได้ง่าย
• ขนาดฐานข้อมูลเล็กลงเนื่องจากไม่ต้องเก็บข้อมูลซ้ำๆ กัน



ไม่มีความคิดเห็น:

แสดงความคิดเห็น