--- title: ห้องทดสอบ PE subtitle: date: วันอังคารที่ 20 ธันวาคม 2565 เวลา 08.45 น. --- (ข้อความสดจากระบบถอดความเสียงพูดทางไกล) (อาจารย์เกวลี) เดี๋ยวเริ่มเลยก็ได้ค่ะ โอเค น่าจะประมาณนี้นะคะ วันนี้จะเป็นบทที่ 5 เกี่ยวกับกระบวนการปรับบรรทัดฐาน ภาษาอังกฤษก็จะเป็นnormaliเนื้อหาวันนี้ก็จะมีจุดมุ่งหมายของการทำ Nomanlizationจะเกี่ยวกับฟังก์ชันการขึ้นต่อกัน แล้วก็หลักการขึ้น normalด้วยนะคะ มีอยู่ 3 ข้อวันนี้โดยการปรับมาตรฐานหรือ Noมันจะเป็นทฤษฎีที่คนออกแบบฐานข้อมูลมาแปลงข้อมูลจากรูปที่ซับซ้อนนะคะ ให้มันง่าย เข้าใจก้งาน นำไปใช้งานก็ง่าย แล้วต้องเป็นระบบที่หลังจากออกแบบแล้ว แล้วนำไปใช้งานจริงต้องเกิดปัญหาน้อยที่สึเโดยกระบวนการทำงานนะคะ ในการปรับบรรทัดฐานนี่มันจะมี 3 ระดับนะคะ จริง ๆ เราก็จะเรียกสะ้น ๆ ระดับแรกจะเรียกว่นะคะ 2NF 3NF นะคะ ในระดับปริญญาตรีนี่ถึง 3NF ได้ก็ถือว่าเก่งมากแล้วแต่ถ้าเป็นระดับที่สูงขึ้นไปอีก ก็จะได้ถึง 5NFนะคะ อันนี้เป็นแผนภาพกระบวนการทำงานนะคะ ก่อนเราจะมาทำแผนภาพปรับบรรทัดฐานได้นี่ มันก็ต้องวิเคราะห์การใช้งานของผู้ใช้งานก่อนเขาต้องการระบบจัดการฐานข้อมูลแบบไหน ต้องการใช้ตารางกี่ตารางในฐานข้อมูลนะคะ หลังจากนั้นก็จะมาวาดรูปเหมือนที่เราเรียนอาทิตย์ที่แล้วนะคะ มาวาดเป็นแผนถาพ ให้เข้าใจว่าสิ่งที่เรากำลังจะออกแบบหรือสิ่งที่เรากำลังจะทำฐานข้อมูลนี่ ตรงตามความต้องการหรือเปล่านะคะ แต่รูปแบบของรูปที่เราวาดอาทิตย์ที่แล้วนี่ จะยังเป็นรูปแบบที่ที่เป็นบรรทัดฐานหรือว่ายังไม่ได้มีการจัดระเบียบความคิดที่มันซับซ้อนคีย์หลักที่มันทับซ้อนกันนะคะ เราก็เลยจะต้องเอาข้อมูลจากที่เราวาดอาทิตย์ที่แล้วนี่มาเข้าสู่กระบวนการปรับบรรทัดฐานก่อน ซึี่งอย่างที่บอกเราทำแค่ถึง 3 NF นี่ก็ถือว่าเก่งมากแล้วแต่อย่างน้อยต้องถึง 3 นะคะ ไอ้บอยด์ คอดด์กไม่ทำก็ละไว้ได้นะคะ แต่อย่างน้อยต้องถึง 3 นะคะ โดยวัตถุประสงค์ของการปรับบรรทัดฐานนะคะ แน่นอนลดความซ้ำซ้อนกันของข้อมูลก็ถือถ้าข้อมูลมันซ้ำกันนี่เราต้องตัดออกไป เพราะถ้าซ้ำกันมันยิ่งซ้พกันมากเท่าไร เนือ้หา และพื้นที่ในการเก็บข้อมูลมันเยอะ แล้วก็สิ้นเปลืองงบประมาณด้วยเหมือนกันรวมถึงลดปัญหาความไม่ถูกต้องของข้อมูลนะคะ ข้อมูลนี่นอกจากจะไม่เกิดความซ้ำซ้อนกันแล้วนี่ มันยังเกิดจากสาเหตุอื่นคือ ถ้าเหมือนที่อาจารย์เคยยกตัวอย่าง ก็คือถ้าเราเก็บข้อมูลหลาย ๆ ที่อย่างนักศึกษาเก็บข้อมูลที่คณะด้วย ที่มหาวิทลัยเก็บที่มหาวิทยาลัยด้วย เก็บที่สาขาด้วย วันหนึ่งคุณอาจจะเปลี่ยนแปลงเบอร์โทรศัพท์ที่บ้านเราก็ต้องไปตามเปลี่ยนทุกที่เลยนะคะ ซึ่งเสียเวลาแล้วคราวนี้ก็จะเป็นที่เถียงกันว่าเบอร์ไหนถูก เบอร์ไหนผิดนะคะ โดยวัตถุประสงค์ของการปรับบรรทัดฐานนี่ ข้อมูลอาจจะเก็บที่แหล่งเนะคะ เก็บอยู่ที่เดียว แต่สามารถเรียนใช้งานหลาย ๆ ที่ พร้อม ๆ กันได้นะคะ แต่ถ้ามันมีการเปลี่ยนแปลงข้อมูล มีการลบหรือการเพิ่มเป็นปัจจุบันที่สุด เราจึงเก็บข้อมูลไว้ที่เดียวมีแก้ไขก็ที่เดียวนะคะ เพราะฉะนั้น ข้อมูลถูกต้องก็เป็นปัจจุบแล้วก็อย่างที่ให้เหตุผลเมื่อกี้นี้นะคะ การเก็บข้อมูล1112222ที่เดียวนี่ มันก็จะลดการผิดพลาด การเปลี่ยนแปลงข้อมูล ปรับปรุงข้อมูล อย่างที่บอก ก็คือเปลี่ยนเบอร์โทรศัพท์หรือว่าเปลี่ยนบ้านเลขที่ ก็เปลี่ยนแปลงที่เดียวเราสามารถเรียกใช้ข้อมูลได้ทุกที่นะคะ ความซ้ำซ้อนกันของข้อมูลนี่ผิดพลาดของการปรับปรุงของข้อมูลนะคะ แนวคิดของการออกแบบฐานข้อมูลนี่ ก็คือการออกแบบข้อมูลที่ซ้ำซ้อนกันน้อยที่สุดนะคะ เพื่อประหยัดพื้นที่แล้วก็ลดปัญหาที่เกิดขึ้น ถ้าข้อมูลมันซ้ำซอนมากเกินไปหรือปริมาณข้อมูลมีเยอะเกินไปนะคะ อย่างเช่นตัวอย่างนะคะ ตารางด้านบน ตารางสีเทาด้านบน จะเป็นการออกแบบฐานข้อมูลที่ดีเดี๋ยวจะมาให้ดูว่าทำไมมันถึงดีกว่าในตารางข้อมูลนี่มันจะมีตารางของพนักงานและตารางสาขานะคะ จะเห็นได้ว่าตารางพนักงานนี่ จะมีส่วนหนึ่งที่เป็นรหัสสาขาห้อยไว้อยู่ ถามว่าทำไมไม่เอาข้อมูลสาขามาไว้ในตารางพนักงานทีเดียวเลยล่ะ ทำไมต้องแยกออกนะคะ อย่างถถ้านักศึกษาดูคนแรกนะคะ ดูคนแรก รหัสสาขาB005ก็คือสาขาเชียงใหม่ถ้าสมมติว่าพนักงานคนที่ 1 ลาออก111111111ก็จะมีการลบข้อมูลเกิดขึ้นใช่ไหมคะ มีการลบข้อมูล ลบคนนี้ออกขีดฆ่าทิ้ง เดี๋ยวนะคะ ขีดฆ่าทิ้ง สิ่งไหนที่หายไปบ้างแน่นอนสาขาเชียงใหม่จะหายไปด้วย สมมตินะคะ ถ้าสมมติเราอยู่ด้วยกัน ถ้าสมมติพนักงานคนนี้ลาออกสาขาเชียงใหม่ยังอยู่ไหม ยังอยู่นะคะ ซึ่งแตกต่างจากด้านล่างนะคะ ด้านล่าง เห็นไหมคะ ว่าถ้าสมมติว่าอาจารย์ลบทิ้งหมดเลยลบทิ้งหมดนี่กากบาททิ้งสาขาเชียงใหม่หายไปด้วยอันนี้คือการออกแบบที่ไม่ดีนะคะ เหมือนว่าคนข้างล่าง คนนี้ออกสาขาพิษณุโลกก็หายไปด้วยแต่ถ้าเป็นตารางด้านบนนะคะ ถ้าคนนี้ลาออก สาขายังอยู่ไหม ยังอยู่เหมือนเดิมนะคะ อันนี้คือการออกแบบฐานข้อมูลที่ดี ถ้าข้อมูลตัวไหนที่มันมีผลกระทบต่อกันเราจะต้องแยกตารางออกนะคะ ตัวอย่างนะคะ ถ้าการออกแบบที่ดีจะลดปัญหาความซ้ำซ้อนกันของข้อมูลออกได้นะคะ อย่างเช่นตรงนี้ อันนี้เป็นตารางที่ออกแบบไม่ดีนะคะ เห็นไหมคะ ว่ามันจะมีรหัสสาขา แล้วก็ที่อยู่ อยู่ในตารางเดียวกันถ้าสมมติว่าอาจารย์เพิ่มเข้ามาใหม่อีก 1 คนนะคะ เป็น EM10 ตรงนี้นะคะ ถ้าอาจารย์ต้องการเพิ่มพนักงานสาขาเชียงใหม่ อาจารย์ก็ต้องมากรอกข้อมูลตรงนี้อีกว่าเชียงใหม่นะ โน่นนี่นั่นโน่นนะคะ แต่ถ้าเป็นการออกแบบฐานข้อมูลที่ดีนี่เราแค่ใส่รหัสสาขานะคะ ไม่จำเป็นจะต้องพิมพ์ที่อยู่ทุกครั้งก็ได้นะคะ เหมือนเวลาคุรไปธนาคารใช่ไหมคะ คึณก็แค่ยื่นบตรัพนักงานธนาคารก็จะกรอกเลขบัตรประชาชนคุณลงไปนะคะ หรืออาจจะเอาชิปการ์ดของคุณเสียบเข้าไปในเครื่อง ถามว่าตอนนี้เราได้กรอกข้อมูลไหม ไม่ต้องขอแค่มีเลขบัตรประชาชน ข้อมูลทุกอย่างที่คุณมีเขาจะดึงออกมาจากระบบให้เลย เราไม่ต้องเสียเวลากรอกนะคะ เหมือนเมื่อก่อนนี่ต้องเขียนใส่กระดาษเลขบัตรประชาชนอะไรที่อยู่ที่ไหน เบอร์โทรศัพท์อะไร เด๋ยวนี้ไม่้องเลย ขอแค่มข้อมูลทุกอย่างเราสามารถดึงขึ้นมาได้อยู่แล้วนะคะ อันนี้ก็เช่นเดียวกันถ้ากรอกข้อมูลแบบไม่ดีนี่เราต้องกรอกข้อมูลทุกช่องทุกช่องเลยนี่คนเดียว ไม่เดือดร้อนค่ะ แต่ถ้าเป็พนักงานใหม่เป็นเหมือนโรงงานน่ะค่ะ ทีละ 1,000 คน ต้องนั่งกรอกเชียงใหม่เป็นพัน ๆ ครั้งนี่ เสียเวลามาก ๆ นะคะ อันนี้คือการออกแบบที่ไม่ดีนะคะ กับอีกอย่างหนึ่ง ถ้าสมมติว่าเมื่อกี้อาจารย์เพิ่มพนักงานแล้ว ถ้าอาจารย์อยากเพิ่มแค่สาขานะคะ อยากเพิ่มแค่สาขาซึ่งในตารางนี้ คีย์หลัก จำได้ไหมคะ จะเป็นคีย์ที่ขีดเส้นใต้ซึ่งอาจารย์อยากเพิ่มสาขา สมมติอาจารย์เพิ่มB100 สกลนครสกลนครนะคะ เพิ่มได้ไหม อาจจะเป็นการตั้งสาขา แต่ยังไม่มีพนักงานหรอกนะคะ ถ้าจากตารางนี้นะคะ เราจะเพิ่มเฉพาะชื่อสาขาไม่ได้ เนื่องจากเรายังไม่มีรหัสพนักงาน เพราะรหัสพนักงานเป็นคีย์หลักคีย์หลัก คือ คุณสมบัติมัน คือ เป็นค่าว่างไม่ได้นะคะ อันนี้จะทำให้เราเพิ่มสาขาไม่ได้ เพราะเราไม่มีพนักงาน อันนี้ก็เป็นข้อผิดพลาดในการเพิ่มข้อมูลถ้าเราออกแบบตารางแบบนี้นะคะ นี่ก็คือปัญญาที่เกิดขึ้นจากการออกแบบไม่ดีกับปัญหาต่อมา เป็นปัญหาการลบข้อมูลอย่างที่อาจารย์บอกคนนี้ลาออก สาขาเชียงใหม่หายไปด้วยนะคะ โดนลบไป กรณีความผิดพลาดจากการเปลี่ยนแปลงนะคะ เหมือน 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 อื่นที่ไม่ใช่คีย์หลักได้นะคะ อย่างเช่นในความสัมพันธ์นี้ คีย์หลักจะมี 2 ตัว มีรหัสนักศึกษากับรหัสวิชานะคะ ถามว่าถ้ากอมีแต่รหัสนักศึกหกดษา เกกกรดนะคะ รหัสวิชา แล้วเราจะรู้ไหมว่าชื่อวิชาที่เราเรียนไปนี่ ชื่อวิชาอะไรนะคะ เหมือนบางคนรู้รหัสวิชา แต่จำชื่อวิชาไม่ได้ก็มีเพราะฉะนั้น รหัสวิชานี่ ก็สามารถไปส่งผลกับชื่อวิชาเหมือนกันเพราะเป็นตัวระบุว่ารหัสวิชานี้ เป็นชื่อวิชาอะไรนะคะ ก็คือคีย์หลักในตารางนี้มี 2 อัน แต่มีคีย์หลัก 1ตัวนี้ แต่ไปมีผลกับอีก Attribute หนึ่งได้นะคะ อันนี้คือการขึ้นต่อกันบางส่วนนะคะ อย่างเช่นตัวนี้ก็จะเป็นของจริง ถ้าสมมติว่าอาจาย์ตัดรหออก มีแค่รหัสวิชา มีเกรด มีชื่อวิชาดารเขียนโปปรแกรมแล้วถาม รู้ไหมคะ ว่าเกรด A นี้ของใครไม่รู้นะคะหรือว่า เดี๋ยวลบอันนี้ออกก่อนนะ