บทที่ 7

การออกแบบฐานข้อมูล

ในรูปแบบบรรทัดฐานขั้นสูง

 

                การออกแบบฐานข้อมูลในทบนี้คุณจะได้เรียนรู้วิธีการทำตารางข้อมูลให้อยู่ในรูปแบบบรรทัดฐาน(Normalization)  ในขั้นที่สูงขึ้น  คือ  ขั้นที่  4  และขั้นที่  5

          อนึ่งการทำตารางข้อมูลให้อยู่ในรูปแบบบรรทัดฐานขั้นสูงนี้จะแตกต่างจากขั้นต้น  ซึ่งจุดสำคัญของรูปแบบบรรทัดฐานขั้นต้น   คือ   เป็นการกระทำที่เกี่ยวข้องกับการขึ้นต่อกันแบบฟังก์ชั่น  (FunctionalDependency)   แต่รูปแบบบรรทัดฐานขั้นสูงนี้เป็นการกระทำที่เกี่ยวข้องกับ   การขึ้นต่อกันแบบหลายค่า(Multi-valued Dependency : MVD) และการขึ้นต่อกันแบบเชื่อม (Join Dependency : JD) ซึ่งจะได้นำเสนอดังต่อไปนี้

7.1  การขึ้นต่อกันแบบหลายค่า

 
 

 

 


สาเหตุที่อาจจะต้องมีรูปแบบบรรทัดฐานขั้นสูงขึ้นไปกว่าเดิมขึ้นมานั้นเนื่องจากรูปแบบบรรทัดฐานขั้นที่ 3 ใหม่ (BCNF) ไม่สามารถจัดการกับปัญหาขงโครงสร้างตารางที่มีลักษณะต่อไปนี้ได้ คือ

          -     อยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 ใหม่แล้ว โดยมีคีย์หลักเป็นคีย์ทั้งหมด (All Key) ของตารางกล่าวคือ มี 3 คีย์ประกอบเป็นคีย์หลัก เป็นต้น

          -    มีปัญหาการปรัปปรุงข้อมูลโดยทำให้เกิดความซ้ำซ้อนในการป้อนข้อมูลลงในตารางดังกล่าว  แม้ว่าต้องการเพิ่มข้อมูลเพียงบางคีย์  กลับต้องเพิ่มทั้งหมดทุกคีย์โดยไม่จำเป็น

          -    ลักษณะตารางดังกล่าวมีการขึ้นต่อกันแบบหลายค่า (Multi-valued Dependencies : MVD) ดังตัวอย่างตารางต่อไปนี้

 

 


CTX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


อันที่จริงตาราง CTX นั้นมีที่มาจากตาราง HCTX ซึ่งไม่อยู่ในรูปแบบบรรทัดฐานขั้นใด ๆ เลย คือ

 

 

 

 

  COURSE                        TETCHER                                   TEXTS

 

 

Physics                                                            

 

 

 

 

 

 

 

Math   

 
HCTX

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


ตาราง  CTX  เป็นการแปลงตาราง  HCTX  ให้อยู่ในรูปแบบบรรทัดฐานขั้นที่  1  แต่ยังมีปัญหาการปรัปปรุงข้อมูล (Update Anomalies) ซึ่งเป็นผมมาจากความซ้ำซ้อน (Redundancy) กล่าวคือ หากจะเพิ่มข้อมูลว่าวิชา Physics มีอาจารย์คนใหม่อีก 1 ท่านคือ Assoc. Prof. Smith  จะต้องแทรกข้อมูลเพิ่ม  2แถว  (Tuple)  ให้เท่ากับจำนวนตำรา  (Text) ที่มี 2 เล่ม ทั้งๆ ที่ควรจะต้องเพิ่มเพียงแถวเดียว ดังนี้

 

 

 


CTX

 

           

           

 

 

 

 

 

 

 

 

จะเห็นว่าระเบียนหรือทูเพิล 2 แถวที่มีเครื่องหมาย ** นั้นเป็นความซ้ำซ้อนและสิ้นเปลืองโดยไม่จำเป็นต้องเกิดขึ้นในลักษณะนี้

          ดังนั้น  ลักษณะที่เป็นปัญหาดังกล่าวจึงได้มีผู้ระบุให้เห็นชัดโดยตั้งชื่อว่า  การขึ้นต่อกันแบบหลายค่า(Multi-valued Dependencies : MVD)  ซึ่งมีการระบุแล้วให้คำจำกัดความไว้ดังจะได้กล่าวถึงต่อไปในกรณีตาราง  CTX  นี้  ถือว่ามีการขึ้นต่อกันแบบหลายค่า 2 ชุด ตามแนวคิดของฟาจิน  (Fagin) คือ

MVD1: COURSI  --> -> TEACHER

          MVD2: COURSE --> -> TEXT

                เครื่องหมาย --> -> อ่านว่า  “กำหนดแบบหลายค่า” (multi-determines) นั้นคือ

          COURSE เป็นตัวกำหนด TEACHER แบบหลายค่า

          และ COURSE เป็นตัวกำหนด TEXT แบบหลายค่า

          คำจำกัดความของ การขึ้นต่อกันแบบหลายค่ามีดังนี้ (C.J. Fate, 2000, p,392)

          “ให้  R เป็นตาราง  และให้ A, B และ C เป็นสับเซตของแอตทริบิวต์ของ R แล้ว เรากล่าวว่า B

ขึ้นต้น  A แบบหลายค่า ในรูปสัญญาลักษณ์ว่า

          A -->-> B

                ก็ต่อเมื่อ  ในทุก ๆ ค่าที่เป็นไปได้ของตาราง  R  เซตของค่า  B  (ซึ่งจับคู่กับคู่ของค่า  A  และ  C)ขึ้นอยู่กับค่า  A  เท่านั้น และเป็นอิสระจากค่า 

          (Multi-valuad dependence : Let R be a relvar, and let A, B and C be subsets of the attribute of R.   Then we say that  B  is multi-dependent on A – in symbols

A -->-> B

            If and only if, in every possible legal value of R, the set of Bvalues matching a

given (A value, C value) pair depends only on the A value and is independent of the C

value.*)

 

7.2  รูปแบบบรรทัดฐานขั้นที่ 4

 
 

 

 

 

 

 


            จะเห็นได้ว่าการที่มีการขึ้นต่อกันแบบหลายค่านี้  ทำให้ไม่เป็นผลดีต่อการออกแบบฐานข้อมูล  จำเป็นจะต้องกำจัดการขึ้นต่อกันแบบนี้ทิ้งไป  โดยทำให้ตารางอยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 (Fourth NormalForm) ซึ่งมีคำจำกัดความ ดังนี้ (C.J. Data, 2000, p.393)

                “ตาราง  R  อยู่ในรูปแบบบรรทัดฐานขั้นที่  4  ก็ต่อเมื่อ มีสับเซต A และ B ของแอตทริบิวต์ของตาราง  R  ที่มีการขึ้นต่อกันแบบหลายค่า คือ A -->-> B และนอกจากนั้นแอตทริบิวต์ทุกตัวของตาราง Rยังขึ้นต่อ  A  แบบฟังก์ชันอีกด้วย”

                (“Fourth Normal Form: Relvar R is in 4NF if and only if, whenever there existsubsets A and B of the attributes of R such that the nontrivial MVD A-->->B is satisfied then all attributes of R are also functionally dependent on A. “)

จะเห็นว่าตาราง CTX ไม่อยู่ใน 4NF เพราะมี  MVD ที่ไม่เป็น FD เลย  (โปรดสังเกตเฉพาะข้อมูล

ในตาราง CTX) กล่าวคือ ไม่มี

          FD: COURSE -> TEACHER

FD: COURSE -> TEXT

แต่มีเฉพาะ

MVD: COURSE -->-> TEACHER

MVD: COURSE -->-> TEXT

ข้อสังเกต**    MVD  เป็น  ลักษณะที่เป็นทั่วไป (Generalization) ของ FD เพราะ FD ทุกตัวเป็น MVD แต่มี MVD บางตัวเท่านั้นที่เป็น FD

          ตัวอย่างการทำตารางให้อยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 เช่น  กรณีตาราง  CTX  นี้  เราสามารถแก้ปัญหาการปรัปปรุงข้อมูล  (Update Anomalies) ในกรณีนี้ได้คือ ทำการแยกตารางออกเป็น 2 ตารางคื่อ

          CT{COURSE, TECHER}

          CX{COURE, TEXT

 

ซึ่งจะได้ข้อมูลได้ข้อมูลในตารางที่ไม่ซ้ำซ้อนเมื่อเพิ่ม Assoc,Prof. Smith ดังนี้

   COURSE                 TETCHER

 

 

  Physics                  Prof. Green

  Physics                  Prof. Brown

  Math                     Prof. Green

  Physics                  Assoc. Prof. Smith

 

                     
CT

 

 

 

 

 

 

 

 

 

 


                     CX

 

 

 

 

 

 

 

 

 

จะเห็นได้ว่าตาราง CT และ CX นอกจากจะอยู่ในรูปแบบบรรทัดฐานขั้นที่  4  แล้วยังอยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 ใหม่ (BCNF) อีกด้วย เพราะเป็น ตารางที่มีแอตทริบิวต์ทุกตัวเป็นคีย์ (‘All Key’ Relvar นอกจากนั้นโปรดสังเกตว่า  เราสามารถทำการเชื่อม (Join) ตาราง CT และ CX เพื่อให้ได้ตาราง CTX ได้ด้วย  จึงเป็นการแยกตารางที่ไม่สูญเสียความหมายของการขึ้นต่อกัน  (Nonloss Decomposition)

 

7.3  การขึ้นต่อกับแบบการเชื่อม

 
 

 

 


          สาเหตุที่อาจจะต้องมีรูปแบบบรรทัดฐานขั้นสูงขึ้นไปกว่าเดิมขึ้นมานั้น เนื่องจากรูปแบบบรรทัดฐานขั้นที่ 4  ไม่สามารถจัดการกับปัญหาของโครงสร้างตารางที่มีลักษณะต่อไปนี้ได้ คือ

-          อยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 แล้ว คือ ไม่มีการขึ้นต่อกันแบบหลายค่า  (MVD)

-          มีปัญหาในการแยกออกเป็นตารางย่อย คือ เมื่อแยกแล้วไม่สามารถเชื่อมเพียง 2 ตารางให้ได้ข้อมูลกลับมาเหมือนเดิมได้ในครั้งเดียว แต่ต้องเชื่อมกัน 3 ตารางย่อย โดยต้องเชื่อม 2 ครั้งขึ้นไป จึงจะได้ข้อมูลกลับมาเหมือนเดิม ตัวอย่างเช่น ตาราง SPJ ซึ่งหากถูกแบ่งออกเป็น 3 ตารางย่อย คือ SP, PJ และ

JS แล้ว จะไม่สามารถเชื่อมกันเพียง 2 ตารางย่อยได้ แต่จะต้องเชื่อมกันทั้ง 3 ตารางย่อย (โดยเชื่อมกัน 2 ครั้ง) จะได้ข้อมูลดังเดิม

1.   ปัญหาการเพิ่มข้อมูล  ถ้าเพิ่มข้อมูล S2, P1, J1 ลงในตาราง  SPJ นี้ จะต้องเพิ่มข้อมูล S1

P1, J1 เข้าไปด้วย  มิฉะนั้นหลังจากแยกเป็น 3 ตารางย่อยแล้วจะไม่สามารถเชื่อมกลับมาได้ดังเดิม  แต่ถ้าเพิ่มข้อมูล S1, P1, J1 เข้าไปก่อนจะไม่เกิดปัญหาดังว่าแต่อย่างใด ผลลัพธ์หลังจากเพิ่มข้อมูล คือ

SNO

PNO

JNO

S1

 

S1

 

S2

 

S1

P1

 

P2

 

P1

 

P1

J2

 

J1

 

J1

 

J1

 

        SPJ

2.  ปัญหาการลบข้อมูล จากข้อมูลในตาราง SPJ หลังสุด เราสามารถลบแถว S1, P1, J1 ทิ้งได้โดยไม่เกิดผลข้างเคียง แต่ถ้าเราจะลบแถว S1, P1, J1 แล้วเราจะต้องลบแถว S2, P1, J1 ไปพร้อมกันด้วยมิฉะนั้น หลังจากแยกเป็น 3 ตารางย่อย แล้วทำการเชื่อมข้อมูลจุไดผลลัพธ์ผิดเพี้ยนไปไมเหมือนเดิม

 

โปรดสังเกตว่าข้อมูลในตาราง SPF มีข้อกำหนด (Constraint) ที่มีลักษณะธรรมชาติที่เป็นวัฏจักร(Cyclic Nature) กล่าวคือ “ถ้ามี  S1 เชื่อมกับ P1 และ P1 เชื่อมกับ J1 และ J1 เชื่อมกลับไปหา  S1 อีกครั้ง  แล้วจะต้องมี  S1, P1 และ J1 อยู่พร้อมในแถว (Tuple) เดียวกัน” ซึ่งเราเรียกข้อกำหนดนี้ว่า ข้อกำหนด  3D (Contraint 3-dencomposable) ซึ่งสามารถนำไปประยุกต์ในโลกความเป็นจริงได้  ตัวอย่าง SPJ พยายามจะบอกเราว่า ถ้ามีข้อมูลว่า

-          Smith จัดส่ง ประแจ

-          ประแจ ถูกใช้ในการ Manhattan

-          Smith จัดส่งวัสดุให้กับโครงการ Manhattan

แล้วแสดว่า

          -     Smith จัดส่งประแจให้แก่โครงการ Manhattan

 

          ข้อกำหนด 3D เกี่ยวข้องกับกรณีเฉพาะที่มีการเชื่อมตารางย่อย 3 ตาราง แล้วได้ตาราง 1 ตารางคือ SPF ดังภาพข้างต้น จึงนำไปสู่ข้อกำหนดเกี่ยวกับตารางซึ่งครอบคลุมกว้างกว่า นั่นก็คือ ข้อกำหนดเรื่อง การขึ้นต่อกับแบบการเชื่อม (Join Dependency: JD) ซึ่งระบุว่า (C.J. Date, 2000, p.396)

 

“ให้ R เป็นตาราง และให้ A, B,…, Z เป็นสับเซตของแอตทริบิวต์ของ R แล้วเรากล่าวว่า R เป็นไปตามข้อกำหนดเรื่องการขึ้นต่อกันแบบการเชื่อม

          * { A, B, …, Z }

          (อ่านว่า “สตาร์ A, B, …, Z”) ก็ต่อเมื่อ ทุก ๆ ค่าที่เป็นไปได้ในตาราง R เป็นผลที่เท่ากับการเชื่อมตารางย่อย A, B, …, Z”

          (“Join Dependency : Let R be a relvar, and let A, B, …, Z be subsets of the

attriebutes of R.  Then we say that R satisfies the JD

          *{A, B, …, Z}

          (Read ‘star A, B, …, Z.”) if and only if every possible legal value of R ins equal to the join of its projection on A, B, …, Z.”)

เช่น ตาราง SPJ มีค่าในตารางที่เป็นผลที่เท่ากับการเชื่อม 3 ตาราง คือ SP, PJ, และ JS เราจึงถือว่ามี

          JD   *  { SP, PJ, JS }

ข้อสังเกตเพิ่มเติม**

การขึ้นต่อกันแบบหลายค่า  (MVD)  เป็นกรณีพิเศษของการขึ้นต่อกันแบบเชื่อม  (JD)  หรือกล่าวได้ว่า  การขึ้นต่อกันแบบเชื่อม  เป็นลักษณะทั่วไปของการขึ้นต่อกันแบบหลายค่า  นั่นเอง  หากมองในอีกมุมหนึ่ง  คือการขึ้นต่อกันแบบหลายค่าทุกตัวเป็นการขึ้นต่อกันแบบเชื่อม  แต่มีการขึ้นต่อกันแบบเชื่อมบางตัวที่ไม่เป็นการขึ้นต่อกันแบบหลายค่า  ซึ่งเราสามารถเขียนเป็นสัญลักษณ์ได้ว่า

          A ->-> BIC =  *{AB, AC}

          ปัญหาของตาราง  SPJ ก็คือ  การมีการขึ้นต่อกันแบบเชื่อมที่ไม่เป็นการขึ้นต่อกันแบบหลายค่า  และไม่เป็นการขึ้นต่อกันแบบฟังก์ชั่นอีกด้วย  ซึ่งเราจำเป็นต้องแก้ไขปัญหานี้

 

7.4  รูปแบบบรรทัดฐานขั้นที่  5

 
 

 

 

 

          จากปัญหาของตาราง  SPJ  ดังกล่าวมาข้างต้น  ซึ่งมีการขึ้นต่อกันแบบเชื่อมที่ไม่เป็นการขึ้นต่อกันแบบหลายค่า  และไม่เป็นการขึ้นต่อกันแบบฟังก์ชั่น  เราจำเป็นต้องแก้ไขโดยการแบ่งตาราง  SPJ  ออกเป็นตารางย่อยหลาย    ตาราง  จนกระทั่งตารางเหล่านั้นอยู่ในรูปแบบบรรทัดฐานขั้นที่  5  (Fifth  Normal  Form : 5NF)  ซึ่งมีนิยมว่า  (C.J. Data, 2000, p.398)

 

 

“รูปแบบบรรทัดฐานขั้นที่  5  :  ตาราง  R  อยู่ในรูปแบบบรรทัดฐานขั้นที่  5  (หรือเรียนว่ารูปแบบบรรทัดฐานแบบเชื่อมตารางย่อย)  ก็ต่อเมื่อการขึ้นต่อกันแบบเชื่อมที่สำคัญทุกตัวที่ประกอบมาเป็นตาราง  R

นั้นเกิดจากคีย์คู่แข่งของตาราง 

          (“Fifth normal form : A relvar R is in 5NF - also called projection-join  normal form (PJ/NF) – if and only if every nontrivial join dependency that holds for R is implied by the candidate keys of R.”)

          กล่าวอีกนัยหนึ่งก็คือ ตารางใดจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 5 ไดก็ต่อเมื่อ การขึ้นต่อกันแบบเชื่อมที่สำคัญทุกตัวที่ประกอบมาเป็นตาราง R นั้น เป็นผลมาจากคีย์คู่แข่งหรือต้องอาศัยคีย์คู่แข่งของตารางR ทุกตัวมารวมกัน

          จากคำจำกัดความข้างต้นนี้ชี้ว่า ตาราง SPJ ไม่อยู่ในรูปแบบบรรทัดฐานขั้นที่ 5 เพราะ

          -    ตารางนี้อาจจะถูกแบ่งเป็น 3 ตารางย่อยได้

          -    การถูกแบ่งเป็น 3 ตารางย่อยนั้นไม่ได้รวมเอาคีย์คู่แข่งซึ่งก็คือ {SNO, PNO, JNO} เข้าไว้ด้วยกันในตารางย่อยใด ๆ เลย

          แต่ในทางกลับกัน ตาราง SP, PJ และ JS ต่างก็อยู่ในรูปแบบบรรทัดฐานขันที่ 5 แล้วเพราะแต่ละตารางไม่ปรากฏว่ามีการขึ้นต่อกันแบบเชื่อมแฝงอยู่เลย  ยกเว้นาการขึ้นต่อกันแบบเชื่อมชนิดไม่สำคัญ   เช่น  การเชื่อมตาราง SP กับตาราง SP คือตัวมันเอง เป็นต้น

          ตัวอย่างเช่น ตาราง S มี SNO และ SNAME เป็นคีย์คู่แข่ง (หมายความว่า ค่าของข้อมูลใน

SNAME ไม่ซ้ำกันเลย) เพราะฉะนั้นตารางนี้จะมีการขึ้นต่อกันแบบเชื่อม คือ

          JD1       *{{SNO, SNAME, STATUS}, {SNO, CITY}}

          จากการมี  JD1 ดังกล่าว ไม่ได้หมายความว่าควรจะต้องแยกตาราง S ออกเป็นตารางย่อยอีก 2  ตาราง เพียงแต่แสดงให้เห็นว่าสามารถจะแบ่งได้เท่านั้นเอง และเมื่อแบ่งแล้วต้องการจะเชื่อมกลับ ก็สามารถทำได้โดยไม่เสียคุณสมบัติการขึ้นต่อกัน      กล่าวคือเชื่อมกันเพียงครั้งเดียวก็จะได้ข้อมูลเดิมทุกประการของตาราง S ทั้งนี้เพราะเป็นผลมาจากคีย์คู่แข่งของตาราง S ทุกตัวมารวมกันในการเชื่อมนั่นเอง อีกตัวอย่างหนึ่ง เช่น ตาราง S เดียวกันนี้อาจตีความให้มีการขึ้นต่อกันแบบเชื่อมดังต่อไปนี้ได้ คือ  JD2     *{{SNO, SNAME}, {SNO, STATUS}, {SNAME, CITY}}

          การขึ้นต่อกันของ JD2 มี SNO และ SNAME เป็นคีย์คู่แข่ง และถูกนำมาเชื่อมกันในทุกขั้นตอนของการเชื่อม ไม่ว่าเราจะเชื่อม {SNO, SNAME} กับ {SNO, STATUD}, หรือเชื่อม {SNO, SNAME} กับ {SNAME, CITY} ก็ตาม  ก็จะได้ผลถูกต้องเหมือกันหมด ไม่มีการสูญเสียคุณสมบัติของการขึ้นต่อกันใด ๆ  

          อย่างไรก็ตาม  การเกิดปัญหาในลักษณะดังกล่าวที่จำเป็นจะต้องทำให้ตารางอยู่ในรูปแบบบรรทัดฐาน ขั้นที่ 5 ซึ่งเป็นขั้นสุดท้ายนี้ค่อนข้างจะเกิดขึ้นน้อยมาก