นอร์มัลไลเซชัน : ตอน 3

 

 
Home Page  |   รายการบทความ   |   ลิงค์ที่เกี่ยวข้อง   |   laploy.com  |  เกี่ยวกับผู้เขียน

 

นอร์มัลไลเซชัน : ตอน 3

 

6.8. วิธีทำนอร์มัลฟอร์มระดับต่างๆ
ท่านได้อ่านนิยามของนอร์มัลฟอร์มระดับต่างๆ ไปแล้ว ในหัวข้อต่อไปนี้ท่านจะได้เรียนรายละเอียดของนอร์มัลฟอร์มแต่ละแบบ

6.9. วิธีทำ 1NF

6.9.1. การทำ 1NF ทางทฤษฏี
ขั้นตอนการทำ 1NF มีดังนี้
•    กำจัดกลุ่มที่ซ้ำ
•    นิยาม PK (หนึ่งหรือหลายกุญแจ)
•    ทำให้ข้อมูลทุกแถวแตกต่างกันและอ้างถึงได้ด้วย PK ห้ามการมีค่าซ้ำใน PK
•    คอลัมน์ทุกคอลัมน์ต้องขึ้นกับ PK อาจเป็นโดยทางตรงหรือทางอ้อมก็ได้
•    ทุกคอลัมน์ต้องเป็นค่าโดดๆ (มีค่าเดียวไม่ใช่ดาต้าคอลเลคชัน เช่นอาร์เรย์ หรือค่าหลายค่าที่คั่นด้วยลูกน้ำ)

6.9.2. การทำ 1NF ทางปฏิบัติ
การทำ 1NF คือการขจัดคอลัมน์ที่มีข้อมูลซ้ำกันด้วยการสร้างตารางใหม่ โดยให้ตารางเดิมเป็น PT ตารางใหม่เป็น CT แล้วเชื่อมโยงกันแบบ master-detail อันเป็นความความสัมพันธ์แบบหนึ่งต่อหลาย ยกตัวอย่างเช่นในภาพ 6-7 จะเห็นว่าตารางทางขวามือเป็นข้อมูลดิบ คอลัมน์ซ้ายสุดคือ Author มีข้อมูลซ้ำกันอยู่สามกลุ่มคือนักเขียนชื่อ Azimov, Blish และ Niven ซึ่งเป็นนักเขียนนิยายวิทยาศาสตร์สามคน สาเหตุที่มีข้อมูลซ้ำเพราะนักเขียนแต่ละคนมีหนังสือมากกว่าหนึ่งเล่ม

คอลัมน์ถัดมาคือ Title เป็นคอลัมน์ซึ่งทำหน้าที่เก็บรายชื่อหนังสือ ก็มีข้อมูลซ้ำกันเป็นกลุ่มๆ อีกเพราะหนังสือหนึ่งเรื่องอาจมีการพิมพ์หลายครั้งหรือมีจำหน่ายในรูปแบบต่าง ๆ (เช่นปกอ่อน ปกแข็ง เป็นเทปบันทึกเสียง ฯลฯ)   คอลัมน์ถัดมาคือ ISBN หรือเลขเรียกหนังสือซึ่งไม่มีข้อมูลซ้ำกันเลย เพราะหมายเลข ISBN แตกต่างกันไปในหนังสือแต่ละเล่มเสมอ คอลัมน์สุดท้ายซึ่งเป็นคอลัมน์ขวาสุดคือ PAGE หรือจำนวนหน้า มีข้อมูลซ้ำกันบ้างแต่ไม่มีความสัมพันธ์ใดๆ ระหว่างกัน การมีจำนวนหน้าเท่ากันเป็นเพียงความบังเอิญเท่านั้น

ทางซ้ายคือโครงสร้างของตาราง AuthorsBooks ซึ่งเป็นตารางที่ยังไม่ได้ทำนอร์มัลไลซ์ (คือตารางที่อยู่ในระดับ 0NF) โปรดสังเกตว่าในตารางมีคอลัมน์ซ้ำๆ กันอยู่เป็นกลุ่ม การพิจารณาตารางนี้และใช้เพียงสามัญสำนึกท่านย่อมตระหนักว่ามันควรจะถูกทำนอร์มัลไลซ์ไปเป็นระดับที่สูงขึ้น (คือระดับ 1NF)

ภาพ 6-7 : ตารางในระดับ 0NF

 

ในตัวอย่างนี้ Azimov คือผู้มีหนังสือมากสุดถึงสิบเอ็ดเล่ม ผู้เขียนจึงเผื่อคอลัมน์ไว้เก็บรายชื่อหนังสือถึงสิบเอ็ดคอลัมน์ แต่ Blish มีหนังสือเพียงสองเล่ม และ Niven มีหนังสือเพียงสามเล่ม ดูในรูป 6-8 ท่านจะเห็นว่าตารางในระดับ 0NF ไม่ดีเพราะมีข้อมูลที่เป็น NULL มากจึงมีพื้นที่เสียเปล่าไปเป็นจำนวนมาก

ภาพ 6-8 : ตารางในระดับ 0NF ไม่ดีเพราะมีข้อมูลที่เป็น NULL และพื้นที่เสียเปล่าไปจำนวนมาก

 

หากต้องการใช้ตารางในระดับ 0NF และต้องการประหยัดเนื้อที่ก็สามารถทำได้โดยกำหนดให้มีคอลัมน์ TITLE เพียงอันเดียว (ไม่ใช่มี 11 อันอย่างในภาพ 6-7)  แล้วเก็บข้อมูลหนังสือทุกเล่มไว้ภายในคอลัมน์เดียวกัน โดยใช้เครื่องหมายพิเศษเช่นลูกน้ำ เพื่อแบ่งชื่อหนังสือแต่ละชื่อออกจากกัน ดังแสดงในภาพ 6-9

ภาพ 6-9 : การเก็บข้อมูลหนังสือทุกเล่มไว้ภายในคอลัมน์เดียวแล้วใช้เครื่องหมายลูกน้ำแบ่งชื่อหนังสือออกจากกัน

 

ภาพ 6-10 เป็นแผนภูมิ ER แสดงการทำ 1NF เพื่อกำจัดคอลัมน์ที่ซ้ำกันโดยสร้างตารางขึ้นอีกตารางหนึ่ง จะได้เป็น PT คือ Author และ CT คือ Book สองตารางนี่เชื่อมโยงกันด้วยความสัมพันธ์แบบ master-detail อันเป็นความสัมพันธ์แบบหนึ่งต่อหลาย

ภาพ 6-10 : การทำ 1NF เพื่อกำจัดคอลัมน์ที่ซ้ำกันโดยสร้างตารางขึ้นอีกตารางหนึ่ง

 

ภาพ 6-11 เป็นแผนภูมิ ER แสดงการทำ 1NF ในลำดับต่อไปคือการนิยาม PK ทั้งใน PT และ CT โดยกำหนดให้ PT มี  PK เป็นคอลัมน์ชื่อนักเขียน (ไม่ได้สร้างกุญแจแทนขึ้นจากชื่อนักเขียน)  ส่วน CT มี PK เป็นแบบกุญแจร่วม (composite key หรือ compound key คือมีข้อมูล  ซ้ำกันอยู่ในทั้งสองตาราง) คือใช้ชื่อหนังสือ, รหัสหนังสือ  และชื่อนักเขียนเป็น PK และใช้คอลัมน์ชื่อนักเขียนทำหน้าที่เป็น FK เพื่อเชื่อมโยงกลับไปยัง PT

ภาพ 6-11 : การนิยาม PK ทั้งใน PT และ CT

 

ภาพ 6-12 คือผลลัพธ์จากการทำ 1NF จะเห็นว่า 1NF ดีกว่าตาราง 0NF ตรงที่เป็นฐานข้อมูลแบบสัมพันธ์ เก็บข้อมูลได้โดยไม่จำกัดจำนวนหนังสือ (ใน 0NF ผู้เขียนต้องกำหนดจำนวนคอลัมน์ TITLE เท่ากับจำนวนหนังสือที่คิดว่ามากที่สุด ในตัวอย่างที่ผ่านมากำหนดไว้ 11 เล่ม หากมีนักเขียนที่มีหนังสือเกิน 11 เล่มก็จะเก็บไม่ได้)  และมีโครงสร้างที่เป็นระเบียบดีกว่าเดิม แต่ 1NF ยังมีปัญหาเรื่องข้อมูลซ้ำซ้อน ทำให้ยังเปลืองเนื้อที่เก็บในฮาร์ดดิสก์อยู่ดี

ภาพ 6-12 : ผลลัพธ์ของการทำ 1NF คือตารางสองตาราง PT คือ Author (ทำหน้าที่เป็น master) และ CT คือ Book (ทำหน้าที่เป็น detail)

 

 

โฆษณา

One Response to นอร์มัลไลเซชัน : ตอน 3

  1. นู๋แหม่ม says:

    ขอบคุณมากคะ….มีประโยชน์มาก ๆ เลย

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  เปลี่ยนแปลง )

Google photo

You are commenting using your Google account. Log Out /  เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out /  เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out /  เปลี่ยนแปลง )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: