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