Normalization: Normal Form ตอนที่ 3

TheWallpaperDB.blogspot.com-_-Miscellaneous-(2)
สวัสดีครับ ณ ตอนนี้ก็มาถึงตอนจบของการทำ Normalization ในกระบวนการสุดท้ายซึ่งก็คือ Normal Form(NF) แล้วครับ ซึ่งผมจะพูดถึงเพียงแค่ NF 1 , 2 , 3 เท่านั้นซึ่งหากใครยังไม่ได้อ่านตอนที่ 1 และ 2 ให้ย้อนกลับไป ดูที่นี่  เพื่อทำเข้าความใจก่อนลงมือประฏิบัติจริง  เอาละผมขอเริ่มเลยละกันโดยเริ่มจากการยกตัวอย่างและอธิบายไปทีละขั่นเลย

             1NF(First Normal Form)

              ในขั้นแรกเป็นการจัดการกับข้อมูลที่เป็นแบบ multiple values ให้แยกออกจากกันแล้วจัดให้อยู่ในรูปแบบ alone value ซึ่งเราจะใช้ PK ของฟิลด์มาทำการจัดรูปแบบการอ้างอิง เหมือนตัวอย่าง จากรูปจะเห็นได้ว่าฟิลด์ skill นั้นมีข้อมูลซ้อนกันอยู่
Image

ซึ่งหลังจากที่เราทำการปรับรูปแบบของรีเลชั่นแล้วก็ได้คือทำการสร้างรีเลชั่นขึ้นมาใหม่ชื่อ Skill และอ้างอ้างไปยังรีเลชั่น Person แบบนี้ครับ โดยการดึงเอา Pk ของ Person ไปใส่ไว้ใน Skill ด้วย

Image

Image

จากรูปเราก็เพียงแค่แยกออกมาให้มันเป็นอย่างในภาพแค่นนี้เราก็เสร็จการทำในขั่นตอน NF1 แล้วครับ ต่อไปเรามาดู NF2 กันต่อเลย

                2NF(Second Normal Form)

               ในขั่นตอนนี้อาจจะต้องใช้เวลานในการอธิบายยาวหน่อย เนื่องจากจะมีกระบวนการใหม๋ที่แรียกว่า full functional dependency เข้ามา ซึ่งต้องประกอบกับว่าต้องเป็น NF1 ด้วยดังนั่นจึงจะสามารถทำ NF2 ได้ แต่ก่อนอื่นนั้นผมขอพูด full functional dependency แบบคราวๆ ให้พอเข้าใจกันก่อน แต่ก่อนอื่นต้องมีพื้นฐานเรื่อง functional dependency มาก่อน

             Full Functional Dependency (FD) นั้นคือ ฟังก์ชันการขึ้นต่อกันแบบเต็มค่า เป็นฟังก์ชันการขึ้นต่อกันที่ determinat มีขนาดเล็กที่สุด และ สามารถระบุถึง dependency ได้ ซึ่งอาจจะพูดได้อีกอย่างว่า คือ FD ที่ ตัว dependent ขึ้นอยู่กับทุก attribute ของ determinant ไม่ใช่เพียงบางส่วน นั่นคือ FD: X -> Y เป็น full FD ก็ต่อเมื่อ ไม่มี Z ซึ่เงป็น subset แท้ของ X เขียนได้อีกอย่างว่า ( Z ⊂ X ) ซึ่งมีคุณสมบัติ  Z -> Y  หรือหากเรามีหากมีหลาย attribute อาจเขียนอยู่ในรูปเซต เช่น

{ A, B} –> { X, Y, Z }  และ FD ที่ไม่ใช่ Full FD เรียกว่า Partial Functional Dependency

ข้อสังเกตง่ายๆ คือหาก x ประกอบด้วย attribute เดียว X –> Y จะเป็น Full FD เสมอ ตัวอย่างเช่น

A –> XYZ                                                    full FD
B –> XZ                                                        full FD
AC –> XYZ                                                 partial FD (เพราะมี A –> XYZ)
XY –> EF                                                     full FD ( หากไม่มี X –> EF หรือ Y –> EF )

 Prime attribute คือ attribute ซึ่งเป็นส่วนหนึ่งของ P.K
Nonprime attribute คือ attribute ซึ่งไม่เป็นส่วนหนึ่งของ P.K

” Relation R อยู่ใน Second Normal Form ถ้า R เป็น 1NF และ ไม่มี  nonprime attribute ใดใน R ที่ มีความสัมพันธ์ แบบ
Partial FD กับ Primary Key นั่นคือ Primary key ต้องมีความสัมพันธ์แบบ Full FD กับทุก  nonprime attribute หรือ ไม่มี
nonprime attribute ใดที่ขึ้นอยู่กับบางส่วนของ P.K “

ซึ่งจากที่ผมอธิบายมาทั่งหมดคือการทำ  full functional dependency ซึ่งถ้าจะพูดกันง่ายคือ เป็นแค่การขจัด attribute ที่ไม่ขึ้นกับ pk ออกไปเพื่อให้ตัวอื่นทั่งหมดขึ้นตรงกับ pk ทั่งหมดเท่านั้น         เอาละเดียวเรามาดูกันว่าหลักจากที่เข้าใจหลักการแล้วเราจะออกแบบรีเลชั่นของเรายังไง

untitled

จากข้อมูลข้างบนคือตารางแสดงการขายหนังสือของร้านหนังสือแห่งหนึ่ง ซึ่งก่อนอื่นเราก็จะมาพิจาราณก่อนว่าอยู่ใน 1NF หรือไม่ จากนั้นเราจะมาหาว่า ทุก nonprime attribute จะต้องขึ้นกับ prime (primary key) ทุกตัว หรือพูดสั่นว่า attribute ทุกตัวจะต้องมี pk เพื่ออ้างอิงไปถึงตัวมันซึ่งจะตรงกับหลักการของ functional dependency ดังนั้นหากดูจากตารางนี้เราก็จะมาทำการแยกแบบนี้ครับ

  1. ค้นหา primary key จะได้ CusNo , BookId นั้นเองครับ 
  2.  จากนั้นก็มาพิจารณาคุณสมบัติว่า nonprime ต้องขึ้นกับ prime ทุกตัว
    1. CusNo —> CusName , CusAddress , CusTel  คือ Partial Dependency
    2. CusNo, BookID —> BookOrder คือ Candidate key
    3. BookID —> BookName คือ Partial Dependency

เมื่อเราแยกได้แล้วเราก็จะสร้างตารางใหม่ขึ้นมาจากที่เราแยกนั้นเองครับ ผมจะขอเสริมอีกนิดนึงตรง CusNo, BookID —> BookOrder  จะเห็นว่ามันเกิดจาก pk สองตัวมารวมกันทำให้มันเป็น BookOrder ขึ้นมา หรือถ้าพูดในภาษาคนให้เข้าใจคือ มันก็เกิดจากที่ลูกค้า 1 คนเข้ามาสั่งซื้อหนังสือไป ดังนั้นจึงต้องกาีรบันทึกการสั่งซื้อด้วย และหากอยากทราบข้อมูลการสั่งซื้อนั้นเราจำเป็นต้องทราบว่าใครสั่ง(CusNo) และสั่งอะไร(ฺBookID) เท่าไร(ฺBookOrder) นั้นเองครับ ตรงนี้ attribute ที่เกิดจากการที่ attribute ตัวอื่นมารวมกันจึงเรียกว่า Candidate key ครับผม

untitledsdfasdfa untitleddfsd sfdad

             3NF(Third Normal Form)

เอาละครับก็มาถึงวิธีสุดท้าย วิธีนี้ก็มีกฏเหมือนกับการทำ 2NF เช่นกันคือ

  1. ต้องอยู่ในคุณสมบัติของ 2NF 
  2. ต้องไม่มี non-key Attribute หรือ Transitive Dependency

ตรงนี้เราจะเห็นเรามีศัทพ์ใหม่ชื่อ non-key Attribute และ Transitive Dependency มาอีกผมจะอธิบายให้ฟังว่ามันคืออะไร ในการทำ 3NF ปกติแล้ว atrribute จะขึ้นตรงกับ pk เท่านั้น ซึ่งปกติเวลาเขียนโปรแกรมเราจะอ้างถึง pk เพื่อดึงเอา attribute ตัวอื่นๆ มาใช้งานหรือทำอะไรสักอย่างนึง แต่ในกรณีที่มันเป็น non-key เนี่ยมันก็จะเกิดขึ้น เมื่อ attribute ที่ไม่ใช้ pk สามารถระบุค่าไปยัง attribute อื่นๆได้ ลักษณะของความสัมพันธ์ในการระบุค่า attribute แบบนี้ เรียกว่า  Transitive Dependency เช่น

รหัสนักศึกษา —- รหัสสาขาวิชา —- ชื่อสาขาวิชา

จากตัวอย่างข้างบนจะเห็นว่า รหัสสาขาวิชา สามารถระบุถึง ชื่อสาขาวิชา ได้ดังนั้น รหัสสาขาวิชา,ชื่อสาขาวิชา จึงถือเป็น Transitive Dependency ดังนั้นจึงถือว่าเป็นส่วนเกินที่ไม่จำเป็นต้องมี เนื่องจากเราใช้เพียงแค่ รหัสสาขาวิชา เราก็สามารถอ้างอิงหรือรู้ได้ว่าถือชื่อสาขาวิชาได้ เดียวเรามาดูตัวอย่างการทำในขั่นตอนนี้กันสักหน่อย เช่นเคยผมจะส้ราง database มาให้และอธิบายให้ฟัง

untitled

จากตารางนะครับคือเป็นการเก็บประวัติของพนักงาน ซึ่งก่อนให้หา pk ก่อนจากนั้นก็หา Transitive Dependency ก็จะได้ดังนี้

  1. หา pk คือ StaffNO
  2. Transitive Dependency คือ DepartNo , DepartName  ซึ่งในจุดไม่จำเป็นต้องใส่ชื่อของแผนก (DepartName ) เนื่องจากเราเพียงแค่รู้รหัส (DepartNo) ก็สามารถรู้ชื่อได้

และเมื่อเราทำตรงนี้เสร็จแล้วก็มาทำการสร้างตารางแยกก็จะได้แบบนี้ครับ

untitledasdfasdf

ซึ่งถ้าสรุปจากที่พูดมาทั่งหมดก็จะมีลำดับการทำดังนี้

  1. ส้รางตารางใหม่ 
  2. นำ Attribute ที่มีปัญหาไปใส่ตารางใหม่
  3. กำหนด Primary Key
  4. ใส่ Attribute ที่มีปัญหา ข้อมูลลงไปในตารางใหม่
  5. นำ Primary Key ไปใส่ตารางเดิม

เอาละครับเพียงแค่นี้ Database ของเราก็มีความแ็ข็งแกร่งมากขึ้นแล้วและดูเป็นมืออาชีพขึ้นมาอีกด้วย ซึ่งผมก็หวังว่าบทความนี้จะมีประโยชน์ไม่มากก็น้อยสำหรับคนที่กำลังทำงานหรือมีปัญหาอยู่ แต่ถ้าหากใครอยากให้ Database ดีกว่านี้ละก็ผมแนะนำให้ทำ BCNF และ 4NF , 5NF ซึ่งเป็นในระดับที่สูงขึ้นไปอีก สำหรับบทความนี้ผมก็ขอจบแต่เพียงเท่านี้นะครับ หวังว่าคงจะอ่านกันเข้าใจเพราะผมได้เรียบเรียงและแปลจากเว็บนอกบ้างนำมาจากหนังสือบ้างและเรียงใหม่ให้มีความง่ายต่อการอ่านมากขึ้น

credit

  • การออกแบบและจัดการฐานข้อมูล (Database Design and Management) , โอภาส เอี่ยมสิริวงศ์
  • http://www.slideshare.net/skiats/normalization-10683732
  • http://alaska.reru.ac.th/text/nor.pdf
  • http://www.gitta.info/LogicModelin/en/html/DataConsiten_Norm3NF.html
  • http://en.wikipedia.org/wiki/Third_normal_form
  • http://en.wikipedia.org/wiki/Second_normal_form
  • http://en.wikipedia.org/wiki/First_normal_form
Facebook Comments