(อาจารย์เกวลี) เดี๋ยวเริ่มเลยก็ได้ค่ะ โอเค น่าจะประมาณนี้นะคะ วันนี้จะเป็นบทที่ 5 เกี่ยวกับกระบวนการปรับบรรทัดฐาน ภาษาอังกฤษก็จะเป็น normalization เนื้อหาวันนี้ก็จะมีจุดมุ่งหมายของการทำ Nomanlization จะเกี่ยวกับฟังก์ชันการขึ้นต่อกัน แล้วก็หลักการขึ้น Nomanlization ด้วยนะคะ มีอยู่ 3 ข้อวันนี้ โดยการปรับมาตรฐานนะคะ หรือ Nomanlization มันจะเป็นทฤษฎีที่คนออกแบบฐานข้อมูลมาแปลงข้อมูลจากรูปที่ซับซ้อนนะคะ ให้มันง่าย เข้าใจก็งาน นำไปใช้งานก็ง่าย แล้วต้องเป็นระบบที่หลังจากออกแบบแล้ว แล้วนำไปใช้งานจริงต้องเกิดปัญหาน้อยที่สุดนะคะ โดยกระบวนการทำงานนะคะ ในการปรับบรรทัดฐานนี่ มันจะมี 3 ระดับนะคะ จริง ๆ เราก็จะเรียกสั้น ๆ ระดับแรกจะเรียกว่า 1NF นะคะ 2NF 3NF นะคะ ในระดับปริญญาตรีนี่ถึง 3NF ได้ก็ถือว่าเก่งมากแล้วนะคะ แต่ถ้าเป็นระดับที่สูงขึ้นไปอีก ก็จะได้ถึง 5NFนะคะ อันนี้เป็นแผนภาพกระบวนการทำงานนะคะ ก่อนเราจะมาทำกระบวนการปรับบรรทัดฐานได้นี่ มันก็ต้องวิเคราะห์การใช้งานของผู้ใช้งานก่อนเขาต้องการระบบจัดการฐานข้อมูลแบบไหน ต้องการใช้ตารางกี่ตารางในฐานข้อมูลนะคะ หลังจากนั้นก็จะมาวาดรูปเหมือนที่เราเรียนอาทิตย์ที่แล้วนะคะ มาวาดเป็นแผนภาพ เพให้เข้าใจว่าสิ่งที่เรากำลังจะออกแบบหรือสิ่งที่เรากำลังจะทำฐานข้อมูลนี่ ตรงตามความต้องการหรือเปล่านะคะ แต่รูปแบบของรูปที่เราวาดอาทิตย์ที่แล้วนี่ มันจะยังเป็นรูปแบบที่ที่เป็นบรรทัดฐานหรือว่ายังไม่ได้มีการจัดระเบียบความคิดที่มันตัดข้อมซับซ้อนคีย์หลักที่มันทับซ้อนกันนะคะ เราก็เลยจะต้องเอาข้อมูลจากที่เราวาดอาทิตย์ที่แล้วนี่มาเข้าสู่กระบวนการปรับบรรทัดฐานก่อน นะคะ ซึี่งอย่างที่บอกเราทำแค่ถึง 3 NF นี่ก็ถือว่าเก่งมากแล้วนะคะ แต่อย่างน้อยต้องถึง 3 นะคะ ไอ้บอยด์คอดด์กับถึง 4NF นีไม่ทำก็ละไว้ได้นะคะ แต่อย่างน้อยต้องถึง 3 นะคะ โดยวัตถุประสงค์ของการปรับบรรทัดฐานนะคะ แน่นอนลดความซ้ำซ้อนกันของข้อมูล ก็ถือถ้าข้อมูลมันซ้ำกันนี่เราต้องตัดออกไป เพราะถ้าซ้ำกันมันยิ่งซ้ำกันมากเท่าไร เนื้อหา และพื้นที่ในการเก็บข้อมูลมันเยอะ แล้วก็สิ้นเปลืองงบประมาณด้วยเหมือนกัน รวมถึงลดปัญหาความไม่ถูกต้องของข้อมูลนะคะ ข้อมูลนี่นอกจากจะไม่เกิดความซ้ำซ้อนกันแล้วนี่ มันยังเกิดจากสาเหตุอื่นคือ ถ้าเหมือนที่อาจารย์เคยยกตัวอย่าง ก็คือถ้าเราเก็บข้อมูลหลาย ๆ ที่นะคะ อย่างนักศึกษาเก็บข้อมูลที่คณะด้วย ที่มหาวิทลัยเก็บที่มหาวิทยาลัยด้วย เก็บที่สาขาด้วย วันหนึ่งคุณอาจจะเปลี่ยนแปลงเบอร์โทรศัพท์ที่บ้าน เราก็ต้องไปตามเปลี่ยนทุกที่เลยนะคะ ซึ่งเสียเวลาแล้วคราวนี้ก็จะเป็นที่เถียงกันว่าสรุปแล้วเบอร์ไหนถูก เบอร์ไหนผิดนะคะ โดยวัตถุประสงค์ของการปรับบรรทัดฐานนี่ ข้อมูลอาจจะเก็บที่แหล่งเดียวนะคะ เก็บอยู่ที่เดียว แต่สามารถเรียนใช้งานหลาย ๆ ที่ พร้อม ๆ กันได้นะคะ แต่ถ้ามันมีการเปลี่ยนแปลงข้อมูล หรือมันมีการลบหรือการเพิ่มเป็นปัจจุบันที่สุด เราเลยเก็บข้อมูลไว้ที่เดียวมีแก้ไขก็ที่เดียวนะคะ เพราะฉะนั้น ข้อมูลถูกต้องก็เป็นปัจจุบันด้วย แล้วก็อย่างที่ให้เหตุผลเมื่อกี้นี้นะคะ การเก็บข้อมูลที่เดียวนี่ มันก็จะลดการผิดพลาด การเปลี่ยนแปลงข้อมูล ปรับปรุงข้อมูลนะคะ เหมือนที่บอก ก็คือเปลี่ยนเบอร์โทรศัพท์หรือว่าเปลี่ยนบ้านเลขที่ ก็เปลี่ยนแปลงที่เดียวเราสามารถเรียกใช้ข้อมูลได้ทุกที่นะคะ ถ้าต้องการข้อมูลนะคะ ความซ้ำซ้อนกันของข้อมูลนี่ หรือเกิดการผิดพลาดของการปรับปรุงของข้อมูลนะคะ แนวคิดของการออกแบบฐานข้อมูลนี่ ก็คือการออกแบบข้อมูลที่ซ้ำซ้อนกันน้อยที่สุดนะคะ เพื่อประหยัดเนื้อที่ในก่ารแล้วก็ลดปัญหาที่เกิดขึ้น ถ้าข้อมูลมันซ้ำซอนมากเกินไปหรือปริมาณข้อมูลมีเยอะเกินไปนะคะ อย่างเช่นตัวอย่างนะคะ ตารางด้านบน ตารางสีเทาข้างบน จะเป็นการออกแบบฐานข้อมูลที่ดี เดี๋ยวจะมาให้ดูว่าทำไมมันถึงดีกว่าในตารางข้อมูลนี่ มันจะมีตารางของพนักงานและตารางสาขานะคะ จะเห็นได้ว่าตารางพนักงานนี่ จะมีส่วนหนึ่งที่เป็นส่วนหนึ่งของข้อมูรหัสสาขาห้อยไว้อยู่ ถามว่าทำไมไม่เอาข้อมูลสาขามาไว้ในตารางพนักงานทีเดียวเลยล่ะ ทำไมต้องแยกออกนะคะ อย่างถ้านักศึกษาดูคนแรกนะคะ พนักงานคนแรก รหัสสาขา B005 ก็คือสาขาเชียงใหม่ ถ้าสมมติว่าพนักงานคนที่ 1 ลาออก ก็จะมีการลบข้อมูลเกิดขึ้นใช่ไหมคะ มีการลบข้อมูล ลบคนนี้ออก ขีดฆ่าทิ้ง เดี๋ยวนะคะ ขีดฆ่าทิ้ง สิ่งไหนที่หายไปบ้าง แน่นอนสาขาเชียงใหม่จะหายไปด้วย ถ้าสมมติเราอยู่ด้วยกัน ถ้าสมมติพนักงานคนนี้ลาออก สาขาเชียงใหม่ยังอยู่ไหม ยังอยู่นะคะ ซึ่งแตกต่างจากด้านล่างนะคะ ด้านล่าง เห็นไหมคะ ว่าถ้าสมมติว่าอาจารย์ลบทิ้งหมดเลย ลบทิ้งหมดนี่กากบาททิ้งสาขาเชียงใหม่หายไปด้วย อันนี้คือการออกแบบที่ไม่ดีนะคะ เหมือนลบคนนี้ออกข้างล่าง คนนี้ออกสาขาพิษณุโลกก็หายไปด้วย แต่ถ้าเป็นตารางด้านบนนะคะ ถ้าคนนี้ลาออก สาขายังอยู่ไหม ยังอยู่เหมือนเดิมนะคะ อันนี้คือการออกแบบฐานข้อมูลที่ดี ถ้าข้อมูลตัวไหนที่มันมีผลกระทบต่อกัน เราจะต้องแยกตารางออกนะคะ ตัวอย่างนะคะ ถ้าการออกแบบที่ดีนี่จะลดปัญหาความซ้ำซ้อนกันของข้อมูลออกได้นะคะ อย่างเช่น ตรงนี้ อันนี้เป็นตารางที่ออกแบบไม่ดีนะคะ เห็นไหมคะ ว่ามันจะมีรหัสสาขา แล้วก็ที่อยู่ อยู่ในตารางเดียวกัน ถ้าสมมติว่าอาจารย์เพิ่มเข้ามาใหม่อีก 1 คนนะคะ เป็น EM10 ตรงนี้นะคะ ถ้าต้องการเพิ่มพนักงานสาขาเชียงใหม่ อาจารย์ก็ต้องมากรอกข้อมูลตรงนี้อีก ว่าเชียงใหม่นะ โน่นนี่นั่นโน่นนะคะ แต่ถ้าเป็นการออกแบบฐานข้อมูลที่ดีนี่ เราแค่ใส่รหัสสาขานะคะ ไม่จำเป็นจะต้องพิมพ์ที่อยู่ทุกครั้งก็ได้นะคะ เหมือนเวลาคุณไปธนาคารใช่ไหมคะ คุณก็แค่ยื่นบัตรประชาชน พนักงานธนาคารก็จะกรอกเลขบัตรประชาชนคุณลงไปนะคะ หรืออาจจะเอาชิปการ์ดของคุณเสียบเข้าไปในเครื่อง ถามว่าตอนนี้เราได้กรอกข้อมูลไหม ไม่ต้อง ขอแค่มีเลขบัตรประชาชน ข้อมูลทุกอย่างที่คุณมี เขาจะดึงออกมาจากระบบให้เลย เราไม่ต้องเสียเวลากรอกนะคะ เหมือนเมื่อก่อนนี่ต้องเขียนใส่กระดาษเลขบัตรประชาชนอะไรที่อยู่ที่ไหน เบอร์โทรศัพท์อะไร เดี๋วนี้ไม่ต้องเลย ขอแค่มีบัตรประชาชน ข้อมูลทุกอย่างเราสามารถดึงขึ้นมาได้อยู่แล้วนะคะ อันนี้ก็เช่นเดียวกันถ้ากรอกข้อมูลแบบไม่ดีนี่ เราต้องกรอกข้อมูลทุกช่องทุกช่องเลยนี่คนเดียว ไม่เดือดร้อนค่ะ แต่ถ้าเป็พนักงานใหม่ เป็นเหมือนโรงงานน่ะค่ะ ทีละ 1,000 คน ต้องนั่งกรอกเชียงใหม่เป็นพัน ๆ ครั้งนี่ เสียเวลามาก ๆ นะคะ อันนี้คือการออกแบบที่ไม่ดีนะคะ กับอีกอย่างหนึ่ง ถ้าสมมติว่าเมื่อกี้อาจารย์เพิ่มพนักงานแล้ว ถ้าอาจารย์อยากเพิ่มแค่สาขานะคะ อยากเพิ่มแค่สาขาซึ่งในตารางนี้คีย์หลักจำได้ไหมคะ คีย์หลักจะเป็นคีย์ที่ขีดเส้นใต้ ซึ่งอาจารย์อยากเพิ่มสาขา สมมติอาจารย์จะเพิ่ม B100 สกลนคร สกลนครนะคะ ถามว่าเพิ่มได้ไหม อาจจะเป็นการตั้งสาขา แต่ยังไม่มีพนักงานหรอกนะคะ ถ้าจากตารางนี้นะคะ เราจะเพิ่มเฉพาะชื่อสาขาไม่ได้ เนื่องจากเรายังไม่มีรหัสพนักงาน เพราะรหัสพนักงานเป็นคีย์หลักนะคะ คีย์หลัก คือ คุณสมบัติมัน คือ เป็นค่าว่างไม่ได้นะคะ อันนี้ก็ทำให้เราเพิ่มสาขาไม่ได้ เพราะเราไม่มีพนักงาน อันนี้ก็เป็นข้อผิดพลาดในการเพิ่มข้อมูล ถ้าเราออกแบบตารางแบบนี้นะคะ นี่ก็คือการปัญหาที่เกิดขึ้นจากการออกแบบไม่ดี กับปัญหาต่อมา เป็นปัญหาการลบข้อมูลอย่างที่อาจารย์บอกนะคะ ถ้าพนักงานคนนี้ลาออก สาขาเชียงใหม่หายไปด้วยนะคะ โดนลบไป กรณีความผิดพลาดจากการเปลี่ยนแปลงนะคะ เหมือน B03 B003 นี่ค่ะ เป็นกรุงเทพฯ ใช่ไหมคะ แล้วคราวนี้ข้อมูลมันอยู่ในตารางเดียวกัน ถ้านักศึกษาจะแก้ สมมติว่าเราย้ายจากรุงเทพฯ ไปอยู่นนทบุรี สมมติมีพนักงาน 3,000 คน คุณต้องแก้กรุงเทพฯ 3000 ครั้ง เป็นนนทบุรีนะคะ ถ้าพนักงานมีคน 2 คน ไม่ใช้ปัญหาค่ะ แต่ถ้าเป็นโรงงานขนาดใหญ่ นั่งแก้ทีละ 3,000 คน ไม่ใช่เรื่องสนุกแน่ ๆ นะคะ อันนี้ก็เป็นปัญหานะคะ เพราะฉะนั้น เราควรแยกตารางพนักงานกับตารางสาขาออกจากกันนะคะ นี่เป็นเหตุผล นี่ข้อมูลเป็นขนาดเล็กนะคะ เรายังเห็นปัญหาขนาดนี้ สมมติถ้าเป็นองค์กรขนาดใหญ่ เป็นบริษัท เป็นโรงงาน หรือระดับโรงเรียนมีนักเรียน 2-3 ร้อย หรือ 2-3 พันคนก็ได้นะคะ มันก็จะมีปัญหาเยอะมาก ถ้าเกิดสมมติว่าเราจัดตารางไม่ดีนะคะ จากปัญหาที่เกิดขึ้นเมื่อกี้ก็อย่างที่บอกค่ะ เราจะแก้ปัญหาโดยการแยกหตารางเป็น 2 ตารางแบบนี้นะคะ ฟังก์ชันการขึ้นต่อกัน เดี๋ยวจะเป็นเกี่ยวกับตารางหนึ่งมีผลกับอีกตารางหนึ่ง เราเรียกฟังก์ชันที่มีการขึ้นต่อกัน เดี๋ยวดูตัวอย่างเลยแล้วกันนะคะ อย่างเช่น ตารางนี้นะคะ ดูจากรหัสพนักงานนะคะ เราจะเห็นได้ว่ารหัสพนักงานจะส่งผลกับชื่อตำแหน่ง สัญลักษณ์ของการขึ้นต่อกันนะคะ อันไหนเป็นตัวหลักจะชี้ไปที่ตัวรองนะคะ ตามหัวลูกศรเลย ดูทิศทางตามหัวลูกศรนะคะ อันไหนเป็นตัวหลักอันไหนเป็นตัวรองนะคะ อย่างเช่น ตัวนี้ถามว่าตำแหน่งมาชี้ที่รหัสพนักงานได้ไหมนะคะ ถามว่าไม่ได้นะคะ เพราะการขึ้นต่อกันจะต้องเป็นลักษณะ 1 ต่อ 1 เท่านั้นนะคะ เป็น 1 ต่อกลุ่ม ไม่ได้ ชนิดของการขึ้นต่อกันนะคะ จะมีอยู่ 4 ชนิดนะคะ ชนิดแรกเป็นการขึ้นต่อกันโดยสมบูรณ์นะคะ ซึ่งอาจจะเป็นเกี่ยวกับตารางนะคะ จะมีคอลัมน์ 1 คอลัมน์ หรือมากกว่า 1 คอมลัมน์มาประกอบกัน นะคะ โดยใน 1 คอลัมน์นั้น ๆ จะบรรจุค่าที่ระบุความพิเศษของแถวแถวหนึ่งได้อย่างชัดเจนนะคะ ก็คือ Attribute Attribute 1 นี่ Record แถว ๆ นั้นนี่ จะมีลักษณะพิเศษอย่างไรนะคะ โดยในทุกความสัมพันธ์นี่จะต้องระบุค่าคีย์หลักไว้ด้วย นะคะ ซึ่งคีย์หลักนี่คือเป็นค่าเอกลักษณ์ ซึ่งไม่ซ้ำกันอยู่แล้วนะคะ อย่างเช่น การขึ้นต่อกันโดยสมบูรณ์อันแรกนะคะ Attribute ที่... จำได้ใช่ไหมคะ คีย์หลักจที่มีขีดเส้นใต้นะคะ คอลัมน์ที่ไม่ใช่คีย์หลักจะขึ้นตรงต่อคอลัมน์ที่เป็นคีย์หลักคอลัมน์เดียวเท่านั้นนะคะ เช่น เลขบัตรประชาชนตัวนี้ จะขึ้นจะเป็นเจ้าของชื่อนี้เท่านั้นนะคะ เพราะฉะนั้น การขึ้นต่อกันอย่างสมบูรณ์ จะเป็นแบบ 1 ต่อ 1 นะคะ เลขบัตรประชาชน 1 เลข จะต้องเป็นของคนคนเดียวเท่านั้น ไม่ใช่ว่าเลขบัตรประชาชนนี้ใช้ 10 คน เป็นไปไม่ได้นะคะ ตัวอย่างนะคะ ตารางที่มีคอลัมน์หลายตัวนะคะ ขึ้นอยู่กับคีย์หลักตัวเดียว เช่น คน 1 คนนี่ ก็จะมีข้อมูล ชื่อ นามสกุล วันเกิด ปีเกิด วันที่ทำบัตร ใช่ไหมคะ แต่ว่าเขาจะต้องขึ้นตรงกับเลขบัตรประชาชนเดียวเท่านั้น ถามว่า 3 คนนี้ อาจจะเกิดวันเดียวกันก็ได้ค่ะ แต่เลขบัตรประชาชนเขาจะไม่เหมือนกัน หรือเขาอาจจะมาทำบัตรวันเดียวกัน แต่เลขบัตรประชาชนเขาจะไม่ซ้ำกันนะคะ คืออะไรซ้ำกันได้ทุกอย่างค่ะ ยกเว้นหมายเลขบัตรประชาชน แต่บางตารางนะคะ ก็อาจจะเป็นการรวมตัวกันของคีย์หลักมากกว่า 1 คีย์หลักนะคะ มารวมกัน เช่น นักศึกษาคนนี้นะคะ รหัสนักศึกษานี้ลงทะเบียนวิชานี้นะคะ ได้เกรดอะไรนะคะ อันนี้ก็เป็นความสัมพันธ์ที่เกิดขึ้นได้เหมือนกัน ถามว่ารหัสนักศึกษาซ้ำกันได้ไหม ไม่ซ้ำนะคะ รหัสวิชาซ้ำกันได้ไหม ไม่ซ้ำนะคะ เหมือนชื่อวิชาอาจารย์ก็รหัสหนึ่งนะคะ ชื่ออาจารย์คนอื่นก็รหัสวิชาอีกอันหนึ่ง อันนี้จะไม่ซ้ำกันอยู่แล้วนะคะ ต่อมาจะเป็นการขึ้นต่อกันบางส่วน มันก็จะเป็นอาศัยความสัมพันธ์ที่เกิดขึ้นจากคีย์ผสมนะคะ อาจจะเป็นขึ้นตรงกับตารางอื่น อาจจะไม่ใช่คีย์หลักก็ได้แต่มันมีความหมายกับอีกคอลัมน์หนึ่งนะคะ เดี๋ยวยกตัวอย่างเลยดีกว่านะคะ อย่างเช่น เมื่อตารางที่อาจารย์ให้ดูเมื่อกี้นะคะ ก็จะมีรหัสนักศึกษาวิชา มีเกรดแล้วก็มีการบอกด้วยว่ารหัสวิชานี้เป็นชื่อวิชาอะไรนะคะ มันจะเป็นการเกิดขึ้น เมื่อคีย์หลักประกอบกันด้วยคอลัมน์หรือว่า Attribute หลาย ๆ Attribute รวมกันโดยบางส่วนของคีย์หลักสามารถไประบุค่า Attribute อื่นที่ไม่ใช่คีย์หลักได้นะคะ อย่างเช่น ในความสัมพันธ์นี้ คีย์หลักจะมี 2 ตัวนะคะ มีรหัสนักศึกษากับรหัสวิชานะคะ ถามว่าถ้ามีแต่รหัสนักศึกษา เกรดนะคะ รหัสวิชา แล้วเราจะรู้ไหมว่าชื่อวิชาที่เราเรียนไปนี่ ชื่อวิชาอะไรนะคะ เหมือนบางคนรู้รหัสวิชา แต่จำชื่อวิชาไม่ได้ก็มีนะคะ เพราะฉะนั้น รหัสวิชานี่ ก็สามารถไปส่งผลกับชื่อวิชาเหมือนกันเพราะเป็นตัวระบุว่าไอ้รหัสวิชานี้ เป็นชื่อวิชาอะไรนะคะ ก็คือคีย์หลักในตารางนี้ มี 2 อัน แต่มีคีย์หลัก 1 ตัวนี้ ไปมีผลกับอีก Attribute หนึ่งได้นะคะ อันนี้คือความขึ้นต่อกันบางส่วนนะคะ อย่างเช่นตัวนี้ก็จะเป็นของจริง ถ้าสมมติว่าอาจาย์ตัดรหัสนักศึกษาออก มีแค่รหัสวิชา มีเกรด มีชื่อวิชาดารเขียนโปรแกรมแล้วถาม รู้ไหมคะ ว่าเกรด A นี้ของใคร ไม่รู้นะคะ หรือว่าเดี๋ยวลบอันนี้ออกก่อนนะคะ หรือว่าอาจารย์ลบรหัสวิชาออก เหลือแต่นักศึกษา เหลือเกรด เหลือชื่อวิชา แล้วถามว่าแล้วรหัสวิชาอะไรล่ะ ที่เราได้เกรด A เราก็ไม่ทราบอีกเหมือนกันนะคะ อันนี้คือเป็นการขึ้นต่อกันบางส่วนนะคะ อันนี้เป็นตัวอย่างนะคะ ต่อมา เป็นการขึ้นต่อกันแบบส่งต่อนะคะ ก็จะเป็นความสัมพันธ์ที่เกิดขึ้นก็ต่อเมื่อ มี Attribute หรือว่าคอลัมน์อื่น ๆ ที่ไม่ใช่คีย์หลัก แต่ไปสามารถขึ้น สามารถระบุค่าของ Attribute อื่นใน Record ได้นะคะ ซึ่งเป็นการออกแบบที่ไม่เหมาะสมนะคะ เพราะส่วนใหญ่แล้วในตารางนี่ ถ้าเราจะระบุค่าอื่นให้กับคอลัมนือื่นได้ ก็ควรจะต้องเป็นคีย์หลักเท่านั้นนะคะ ดูตัวอย่างนะคะ เช่น ตารางนี้เขาบอกว่าสิ่งที่เกิดขึ้น คือ Attribute ก็คือคอลัมน์ที่ไม่ใช่คีย์หลัก หรือ Primary Key นะคะ ก็คือไม่คอลัมน์ที่มีเส้นขีดนี่ มันไประบุค่าอื่น ๆ ในตารางได้ เช่น ตารางนี่คีย์หลักก็คือเลขที่ประจำตัวนะคะ โดยเลขประจำตัวนี้จะไปมีผลกับชื่อ นามสกุล ที่อยู่ ตำแหน่ง ใช่ไหมคะ แต่คราวนี้ รถประจำตำแหน่งมันไม่ถูกระบุโดยเลขประจำตัว มันถูกระบุโดยรหัสตำแหน่งเหมือนถ้าเป็นผู้จัดการนี่ แทนที่ผู้จัดการนี่จะรู้เลยว่ารถประจำตำแหน่งคืออะไร แต่เขาไปเช็กเลขแทนที่จะเช็กกับเลขประจำตัว อันนี้คือการออกแบบที่ไม่ดี เพราะฉะนั้น ถ้าสมมติว่าจะให้รถประจำตำแหน่ง วิธีการแก้ปัญหา ก็คือเราควรจะแยกตารางนี้ ออกไปสร้างตารางใหม่เลยค่ะ มันไม่ควรจะมาขึ้นกับตารางที่มีคีย์หลัก แต่ไม่สามารถระบุค่าข้อมูลตรงนี้ได้นี่มันไม่ควรทำนะคะ กับต่อมาเป็นการขึ้นต่อกันเชิงกลุ่มนะคะ ก็จะเป็นความสัมพันธ์ระหว่างคอลัมน์ หรือ Attribute นี่ แบบขึ้นต่อกันโดยสมบูรณ์นะคะ ก็ไปสามารถไประบุค่าอื่นได้นะคะ โดยที่อย่างเช่นตัวอย่างนะคะ ในตารางนี้นะคะ จะมีรหัสหลักสูตร สามารถระบุรหัสวิชาได้หลายวิชา เช่น จริง ๆ ในรหัสนักศึกษาจะได้เห็นได้ว่ามีเลข 122 เป็นรหัสนักศึกษานี่ มี 122 คืออะไร 122 ก็คือหลักสูตรที่เราเรียนอยู่นะคะ ซึ่งในหลักสูตรที่เราเรียนนี่ มันมีวิชามากกว่า 20 วิชานะคะ นั่นก็คือในรหัสหลักสูตรนี่ มันสามารถระบุรหัสวิชาได้หลากหลายวิชามาก ๆ นะคะ อันนี้ก็คือการขึ้นต่อกันแบบมีค่านะคะ รหัสหลักสูตร สามารถระบุรหัสวิชาได้หลายค่านั่นเองนะคะ แล้วรหัสหลักสูตรก็สามารถระบุค่ารหัสนักศึกษาได้หลายคนเช่นกัน เหมือนตอนนี้หลักสูตรที่เราเรียนนี่ มีนักศึกษามากกว่า 100 คน แต่รหัสหลักสูตรเดียวนะนะคะ นี่คือความสัมพันธ์สามารถระบุค่าได้มากกว่า 1 นั่นเองแบบหลายค่านะคะ เพราะฉะนั้น วิธีการแก้ปัญหาของสิ่งที่เกิดขึ้นนะคะ เราเลยจะต้องมีการกระบวนการปรับบรรทัดฐาน หรือว่ากระบวนการปรับปรุงโครงสร้างของข้อมูล ที่มีความซ้ำซ้อนกันให้อยู่ในรูปแบบที่เป็นบรรทัดฐาน เป็นรูปแบบที่พร้อมที่จะเอาไปพัฒนาเป็นฐานข้อมูลได้นะคะ โดยหลักการนะคะ อย่างที่บอก มี 5 ระดับ แต่ในระดับที่ 3 นี่ ก็เพียงพอสำหรับการออกแบบฐานข้อมูลในปัจจุบันแล้วนะคะ โดยคีย์หลักของการทำงานนะคะ ขั้นที่ 1 นะคะ กำจัดกลุ่มของข้อมูลมีความซ้ำซ้อนกันออกไป ข้อแรกง่ายมาก ๆ ง่ายที่สุด ก็คือ 1NF นะคะ ต่อมาขั้นที่ 2 หรือ 2NF นะคะ จะกำจัดการขึ้นต่อกันบางส่วนออกนะคะ ขั้นสุดท้าย 3NF นะคะ กำจัดการขึ้นต่อกันของ Attribute ที่ไม่ใช่คีย์หลักนะคะ เดี๋ยวจะมาดูทีละขั้น ว่ามันจะต้องเป็นอย่างไรบ้างนะคะ ข้อแรกง่ายที่สุดง่ายมาก ๆ นะคะ ให้นักศึกษาจำกระบวนการหลัก ๆ ก็จะมีอยู่ 3 ข้อนี้นะคะ ดูก่อนว่าข้อมูลมันซ้ำซ้อนกันไหม ขั้นที่ 2 ก็ดูมันขึ้นต่อกันแค่บางส่วนหรือเปล่านะคะ ขั้นที่ 3 ถ้าอันไหนไม่ใช่คีย์หลัก แต่มันไปส่งผลกระทบกับข้อมูลอื่นได้หรือเปล่านะคะ ดูขั้นตอนที่ 1 ก่อนนะคะ ขั้นต้อนที่ 1 ง่ายมากนะคะ ทุก ๆ คอลัมน์นะคะ หรือ Attribute ในแต่ละ Record จะต้องเป็นค่า Single Value ก็คือมีค่าเดียวเท่านั้นนะคะ จะใส่แบบนี้ไม่ได้ เพราะฉะนั้น ข้อมูลทุกแถวจะต้องมีค่าที่ไม่ซ้ำกัน อย่างตัวนี้ นักศึกษาคนที่ 1 แน่นอนนักศึกษา 1 เทอมนี้คุณลงทะเบียนประมาณ 6-7 วิชาใช่ไหมคะ ข้อมูลมันก็จะเป็นแบบนี้ ถ้าเราไม่มีการทำ Normalization แต่คราวนี้ขั้นตอนที่ 1 เราจะตัดข้อมูลที่ซ้ำซ้อนกันออก วิธีการง่ายมากค่ะ คือแยกข้อมูลออกเป็นอย่างละแถวที่ไม่ซ้ำกัน ดูตัวอย่างนะคะ วิธีการทำ 1NF ง่ายมากค่ะ ถ้าข้อมูลตัวไหนเป็นกลุ่มนี่ค่ะ คนที่ 1 ลงวิชา... ลงทะเบียนเรียน 3 วิชาใช่ไหมคะ คนที่ 2 มี 2 วิชา สามารถทำในรูปแบบ 1NF ก็คือเอามากระจายออกมาค่ะ เอาข้อมูลพวกนี้ออกมา กระจายออกเห็นไหมคะ กระจายออก 1NF ง่ายมากนะคะ ข้อมูลพวกนี้ก็ทำซ้ำลงมา ทำซ้ำลงมา ทำซ้ำลงมานะคะ ทำซ้ำลงมา ถามว่าอาจารย์คะ ทำไมมัน... แล้วทำไม 001 มันซ้ำกันได้ล่ะ โน่นนี่นั่นโน่นแต่รหัสวิชาเขาไม่ซ้ำกันเห็นไหมคะ 1NF นี่ ง่ายมากค่ะ ข้อมูลถ้ามันเป็นก้อนอาจารย์นี้ เรากระจายมันออกเป็นบรรทัด ๆ เลย แค่นั้นเอง อย่างน้อยในข้อสอบ ต้องทำ 1NF ให้ได้เพราะมันง่ายที่สุดแล้วนะคะ อย่างเช่นตัวนี้นะคะ ก็กระจายออกมา แล้วคราวนี้ถ้าเรากระจายข้อมูลเรียบร้อยแล้วนะคะ ก็จะมาดูว่าอย่างในตารางนี้น่ะค่ะ มันมีตารางเป็นตารางเป็นของพนักงานใช่ไหมคะ เขาจะมีคีย์หลัก 1 ตัวแล้ว แต่ว่ามันยังมีตัวนี้ค่ะ ตัวที่ 1 ตัวที่ 2 ที่มีคุณสมบัติเป็นคีย์หลักได้ เราต้องแยกมันออกนะคะ กระบวนการนะคะ ดูก่อนว่านี่ตารางเมื่อกี้นะคะ สิ่งที่ขึ้นตรงกับคีย์หลักตัวนี้นะคะ จะเป็นตัวที่ 1 ตัวที่ 2 ตัวที่ 3 สังเกตแล้วว่าคีย์หลักมีตัวเดียว แต่ข้อมูลมีเยอะมากนะคะ เราแยกออกมาได้อันแรกเลย ก็จะมีรหัสโพรเจกต์นะคะ แล้วก็ชื่อ project ใครเป็นผู้จัดการ เงินเดือนเท่าไร ไม่ใช่สิงบประมาณเท่าไรนะคะ อันนี้คือมันจะเชื่อมโยงกับข้อมูลที่เป็นคีย์หลักก็คือโพรเจกต์โค้ดตัวนี้นะคะ ส่วนตัวนี้เป็นคีย์คู่แข่ง 2 ตัวนะคะ 2 ตัวนี่มันสามารถทำหน้าที่เป็นคีย์หลักให้กับอย่างตัวนี้นะคะ มันจะเป็นคีย์หลักให้กับชื่อของพนักงาน อย่างตัวนี้ก็จะเป็นคีย์หลักสำหรับชื่อแผนกนะคะ ถามว่ามันขึ้นตรงกับ Project Code ไหม ไม่นะคะ เพราะฉะนั้น การทำขั้นตอนต่อมานะคะ 2NF ขั้นตอนที่ 1 เราจะต้องทำ 1NF มาเรียบร้อยแล้ว ซึ่งง่ายมาก ๆ นะคะ แล้วก็ต้องมาตัดของการขึ้นบางส่วนออกนะคะ ก็คือการกำจัด Attribute ที่ไม่ขึ้นกับคีย์หลักของตารางนั้น ๆ นั่งเอง กำจัดออกนะคะ อย่างเช่นตัวนี้นะคะ การขึ้นต่อกันบางส่วน จะเห็นได้ว่ารหัสวิชากับชื่อวิชามันไม่ขึ้นตรงกับรหัสนักศึกษาใช่ไหมคะ อันนี้จำได้นะ คะ รูปเดิมนะคะ รูปเดิมวิธีกำจัดปัญหาเราก็ดึงสิ่งที่มันเป็นปัญหาค่ะ สิ่งที่มันไม่ขึ้นตรงกับคีย์หลักตัวนั้น ไปสร้างตารางใหม่ สร้างตารางเพิ่มนะคะ เอาสิ่งที่เป็นปัญหาออกมาไปใส่ตารางใหม่ กำหนดคีย์หลักใหม่นะคะ ในตารางเดิมนะคะ เราก็เอาคีย์หลักของตารางใหม่ไปใส่แค่นั้นเองนะคะ วิธีการ ก็คือเหมือนรูปนี้นะคะ สิ่งที่เป็นปัญหาที่อาจารย์ยกตัวอย่าง ก็คือรหัสวิชากับชื่อวิชานะคะ เพราะรหัสวิชามันไม่ได้ขึ้นตรงกับรหัสนักศึกษานะคะ เพราะฉะนั้น ไอ้ 2 ตัวนี้คือสิ่งที่เป็นปัญหานะคะ วิธีแก้ปัญหาคือเราสร้างตารางผลการเรียนใหม่ สร้างตารางวิชาใหม่ นี่เห็นไหมคะ ในตารางใหม่เราจะตัดชื่อวิชาออก แต่ต้องเหลือรหัสวิชาไว้ เพื่อให้ไปเชื่อมโยงว่ารหัสวิชานี้ มันชื่อวิชาอะไร จากอีกตารางหนึ่งแค่นั้นเองนะคะ โอเคค่ะ อันนี้เป็นตัวอย่างของการปรับบรรทัดฐานในรูปแบบของ 2NF นะคะ แต่เดี๋ยวอันนี้จะให้ทำเป็นการบ้าน เดี๋ยวค่อยย้อนกลับมาแล้วกันนะคะ เดี๋ยวค่อยย้อนมาสั่ง อันนี้เป็น 1NF นะคะ อันนี้ก็แก้แล้ว ตารางเมื่อกี้นะคะ ต่อมาขั้นตอนสุดท้ายนะคะ 3NFนะคะ โดยความสัมพันธ์นะคะ ก่อนที่จะทำเป็น 3NF ได้ จะต้องเป็น 2NF ก่อน หลักของการทำขั้นตอนที่ 3 คือต้องเอาความสัมพันธ์ที่ไม่ใช่คีย์หลักออกนะคะ เช่น ไม่ใช่คีย์หลักแต่ไปมีผลกับคอลัมน์อื่นไม่ได้นะคะ ไม่ได้ วิธีการแก้ปัญหา เช่นเดิมค่ะ สร้างตารางใหม่ขึ้นมาแก้ปัญหานั้น ๆ นะคะ อย่างเช่น ในตัวอย่างนะคะ รหัสพนักงานนะคะ ชื่อ สกุล รหัสแผนก ชื่อแผนก เงินเดือน จะเห็นได้ว่าในตารางนี้ คีย์หลัก ก็คือรหัสพนักงานนะคะ แต่มันมีรหัสแผนกกับชื่อแผนกติดมาด้วย ซึ่งมันไม่ได้เกี่ยวกับรหัสพนักงานเลยนะคะ วิธีการแก้ปัญหา ก็คือเอารหัสแผนกกับชื่อแผนกไปสร้างตารางใหม่ แต่ต้องยังคงรหัสแผนกไว้ในตารางเดิมนะคะ เพื่อให้มันเชื่อมโยงได้ว่า ไอ้แผนก A001 นี่ คือแผนกอะไรนะคะ อันนี้คือการแก้ปัญหา ไม่ใช่คีย์หลักแต่ไปส่งผลกับคอมลัมน์อื่นในตารางนะคะ อันนี้คือ 3NF จริง ๆ แล้วอยากให้ลองทำในห้องมากกว่า แต่ด้วยสัปดาห์นี้มันมีข้อกำจัดนะ ก็ไม่เป็นไรนะคะ อันนี้เป็นตัวอย่างนะคะ สรุปนะคะ วิธีการทำ Normalization หรือว่าการปรับบรรทัดฐานนะคะ 1NF ก็คือทุก ๆ Attribute นะคะ ทุก ๆ คอลมัน์ ก็คือทุก ๆ คอลัมน์ในแต่ละแถวจะต้องมีค่าของข้อมูลเพียงค่าเดียวเท่านั้นนะคะ อย่างเช่น เหมือนเวลาเรากรอกเบอรโทรศัพท์เรามีโทรศัพท์ 3 เบอร์ก็จริง แต่เราจะกรอกได้เบอร์เดียวนะคะ ถ้าอยากใส่เบอร์ที่ 2 ที่ 3 ก็ต้องเพิ่มข้อมูลแถวใหม่ขึ้นมานะคะ ต่อมา 2NF นะคะ ก็ปัญหา ก็คือถ้ามีข้อมูลนะคะ ข้อมูลทุกตัวในตารางนั้นจะต้องขึ้นกับคีย์หลักของตารางตัวเดียวเท่านั้นนะคะ ข้อที่ 3 ถ้าคอลัมน์ไหนที่ไม่ใช่คีย์หลักนะคะ จะมาส่งผลกับคอลัมน์อื่นในตารางไม่ได้นะคะ เพราะฉะนั้น ไอ้ตาราง ข้อ 1 ก็คือแค่กระจายตาราง อันที่ 2 อันที่ 3 ถ้ามีปัญหาปุ๊บเราต้องสร้างตารางใหม่นะคะ การบ้าน เอาอย่างนี้ดีกว่านะคะ อาจารย์จะให้ทำน่าจะส่งวันนี้เอาแค่ข้อเดียวนะคะ ข้อเดียวพอ เพราะว่าจริง ๆ อยากให้ทำในห้อง เดี๋ยวสัปดาห์หน้าให้ทำในห้อง แต่ให้ทำก่อนว่าที่เรียนไปวันนี้เข้าใจไหมนะคะ ถ้าทำเสร็จแล้วก็ค่อยเอามาส่งที่ตู้ส่งงานอาจารย์ เอาเฉพาะข้อนี้นะ ข้อเดียว ข้อเดียวพอ วันนี้ข้อเดียวพอนะคะ ส่งในเวลานี่ล่ะนะคะ ให้ลองทำดูว่าเข้าใจไหม ข้อนี้ทำ 1NF ทำ 1NF ทำอย่างไร ง่ายมาก ๆ เลยนะคะ อาจารย์เว้นช่องว่างให้แล้วเติมมานะคะ 2NF คุณเห็นไหมว่า นี่มันมีรหัสวิชานี่ ชื่อวิชานี่ต้องทำอย่างไรกับมันนะคะ แยกมันออกมาสิแยกอย่างไรนะคะ เอาข้อเดียวก่อน แล้วลองส่งมาให้อาจารย์ดูเข้าใจมากน้อยขนาดไหนนะคะ จริง ๆ อยากให้เรียนในห้องมากกว่า แต่วันนี้ก็เอาประมาณนี้ก่อนแล้วกันนะคะ ให้ทุกคนหายดีกลับมา อาทิตย์หน้าค่อยเดินดูในห้องดีกว่านะคะ วันนี้ก็จะประมาณนี้นะคะ เดี๋ยวเวลาที่เหลือให้ทำข้อนี้แล้วมาส่งวันนี้เลยยิ่งดีนะคะ เวลาที่เหลือทำใส่กระดาษมาส่งอาจารย์แล้วกันนะ ก็ประมาณนี้ค่ะ เวลาที่เหลือทำให้เสร็จภายในวันนี้นะคะ ข้อเดียวเองนะคะ ข้อเดียว มีใครสงสัยไหมคะ ปุ๋ยสงสัยไหม ปุ๋ยเปิดไมค์ได้หรือเปล่า (นักศึกษาหญิง) ไม่มีค่ะ อาจารย์ เดี๋ยวถ้าอย่างไร เดี๋ยวให้อุบลไปส่งหอแล้วน่ะค่ะ อุบล(อาจารย์เกวลี) อ๋อ ส่วนมากอยู่ไหนกันอยู่หอหรืออยู่ DSS (นักศึกษาหญิง) ตอนนี้เหลืออยู่ DSS ประมาณ 4 คนค่ะ (อาจารย์เกวลี) ก็รวม ๆ เท่าไรได้ก็เอามา (นักศึกษาหญิง) ค่ะ ๆ ๆ (อาจารย์เกวลี) ก็ให้เด็กทำนั่นแหละโอเค Thank you ค่ะ วันนี้ก็ประมาณนี้ค่ะ ขอบคุณทุกคนมากนะคะ ที่ตั้งใจเรียนกันอยู่ ถ้าใครทำเสร็จก็ทำให้เสร็จแล้วฝากเพื่อนมากส่ง รวมกันมาส่งก็ได้นะคะ ถ้าใครอยู่หอก็มาส่งที่ DSS ก็ได้ หรือว่าใครเสร็จแล้วมาส่งที่โต๊ะอาจารย์ก็ได้นะคะ โอเคค่ะ วันนี้ก็ประมาณนี้ค่ะ ขอบคุณล่ามด้วยนะคะ ค่ะ ขอบคุณค่ะ ปุ๋ยวันนี้ครบนะ ปุ๋ยไปแล้ว โอเค