You are currently viewing ออกแบบตาราง

ออกแบบตาราง

ออกแบบตาราง (Table) ใน Access เป็นเรื่องพื้นฐานที่ควรทำความเข้าใจให้ดี เนื่องจาก “ตาราง” เปรียบเสมือน “กระดูกสันหลัง” ของ Access ก็ว่าได้ เพราะเราเก็บข้อมูลทั้งหมดไว้ใน “ตาราง” ถ้าหากเราออกแบบตารางไม่ดี จะทำให้มีปัญหาตามมามากมายอย่างที่หลายคนคิดไม่ถึง

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

หมายเหตุ สำหรับบล็อกนี้จะเน้นเรื่องการทำตารางใน Access ก่อน สำหรับใครที่ทำฐานข้อมูลใน Excel ลองอ่านที่ เทคนิคการใช้ excel เป็นพื้นฐานก่อน แล้วจะเขียนถึงการจัดทำตาราง Excel อีกครั้งในตอนต่อไป

ออกแบบตาราง

ตาราง (table) เป็นวัตถุ (object) ที่เก็บข้อมูล จะประกอบด้วย

ข้อมูลในแนวตั้ง หรือ คอลัมน์ เรียกว่า เขตข้อมูล หรือ Field ซึ่งจะเก็บข้อมูลในแต่ละส่วนไว้ เช่น เขตข้อมูล Employee ใช้เก็บรายชื่อพนักงานขาย เขตข้อมูล Customer ใช้เก็บรายชื่อลูกค้า เขตข้อมูล Order Date ใช้เก็บวันที่คำสั่งซื้อ เป็นต้น

ข้อมูลในแนวนอน หรือ แถว เรียกว่า ระเบียน หรือ Record คือกลุ่มของเขตข้อมูลที่มีความสัมพันธ์ในเรื่องเดียวกัน อย่างเช่น คำสั่งซื้อหมายเลข 1 จะประกอบด้วยเขตข้อมูลหลายอย่างเช่น Customer Employee Order Date ฯลฯ และอื่น ๆ ที่เกี่ยวข้องกับคำสั่งซื้อนั้น

ออกแบบตาราง

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

ดังนั้น สิ่งที่ต้องคิดในตอนออกแบบฐานข้อมูลก็คือ

  • ข้อมูลใดที่ต้องเก็บ
  • จัดเก็บข้อมูลเป็นตารางกี่ตาราง แต่ละตารางมีกี่เขตข้อมูล อะไรบ้าง?
  • ความเชื่อมโยงของแต่ละตาราง

มีคำถามที่อยากให้ท่านลองสังเกตฐานข้อมูลที่ท่านต้องการออกแบบ ดังนี้

ทำฐานข้อมูลเพื่ออะไร?

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

คำตอบของคำถามนี้ จะเป็นกรอบสำหรับการออกแบบ โดยต้องตรวจสอบเป็นระยะว่า การออกแบบตารางและเขตข้อมูลต่าง ๆ เหมาะสมและนำไปใช้งานได้ตรงตามวัตถุประสงค์ของการสร้างฐานข้อมูลหรือไม่

ต้องเก็บข้อมูลอะไรบ้าง?    

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

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

DataRevol.com มีความเชื่ออย่างหนึ่งว่า ถ้าท่านเข้าใจสิ่งที่กำลังทำอยู่ (คือมีวัตถุประสงค์ชัดเจน) ท่านก็จะรู้ว่ามีข้อมูลใดสำคัญหรือจำเป็นที่ต้องเก็บ ข้อมูลใดที่ปล่อยทิ้งได้ แต่ที่พบปัญหาส่วนใหญ่ คือ การสร้างฐานข้อมูลให้กับบุคคลอื่น ซึ่งผู้สร้างฐานข้อมูลอาจจะไม่เข้าใจวัตถุประสงค์ชัดเจน การพูดคุย ทำ requirement แล้วอาจจะมีปัญหาเรื่องการสื่อสาร เข้าใจไม่ตรงกัน

Tip: รายการข้อมูลเหล่านี้เพิ่มเติมหรือปรับแต่งภายหลังได้ แต่อย่างไรก็ตาม ยังคงแนะนำให้ลองคิดรูปแบบข้อมูลต่าง ๆ ที่ต้องการให้ถ้วนถี่เสียก่อน ลองนึกว่า ถ้าท่านทำฐานข้อมูลลูกค้า แต่ในตอนแรกไม่คิดจะเก็บหมายเลขโทรศัพท์ไว้ พอคุณมีฐานข้อมูลสัก 10,000 รายการ เกิดอยากจะเพิ่มข้อมูลหมายเลขโทรศัพท์ขึ้นมา ก็อาจจะทำให้ต้องมาปรับปรุงข้อมูลเดิมที่มีอยู่ด้วย อาจจะยุ่งยากนิดหนึ่ง (ถ้าเทียบกับว่าใส่ไว้ตั้งแต่แรก) แต่ก็ไม่ใช่ว่าจะเพิ่มไม่ได้

ต้องเข้าใจอย่างหนึ่งว่า รูปแบบการเก็บข้อมูลนี้ไม่มีอะไรถูกผิด มีแต่เหมาะสมกับสิ่งที่เราต้องการหรือไม่ ยกตัวอย่างเช่น การเก็บรายชื่อ มันมีทางเลือกตั้งแต่ ท่านจะเก็บ คำนำหน้า-ชื่อ-นามสกุล ไว้ใน field เดียวกันหรือไม่ หรือจะแยก คำนำหน้าไว้ field หนึ่ง ชื่ออีก field หนึ่ง นามสกุล อีก field หนึ่ง อันนี้ก็แล้วแต่ว่าเราต้องการละเอียดขนาดไหน เช่น ถ้ามีชื่อเพื่อ “ให้มี” เฉย ๆ เรา อาจจะรวมคำนำหน้า-ชื่อ-นามสกุล ไว้ใน field เดียวกัน แต่ถ้าเราต้องเรียงลำดับตาม นามสกุล หรือ ชื่อ ก็ต้องแยกไว้คนละเขตข้อมูล

ขอให้คำนึงว่า field แต่ละ field ควรมีข้อมูลยิบย่อยที่สุดเท่าที่มีประโยชน์ อย่างเช่น การใส่ที่อยู่ ควรจะแยกจังหวัด อำเภอ ตำบล ออกจากกัน เพื่อสามารถนำไปใช้งานแยกต่างหาก สะดวกสำหรับการจัดทำรายงาน เช่น ทำกลุ่มรวมว่าลูกค้าอยู่ในอำเภอใด ตำบลใด มากที่สุด แบบนี้เป็นต้น

Tip: วิธีง่าย ๆ แบบหนึ่งคือตั้งคำถามก่อนว่า เราต้องการ “คำตอบ” อะไรจากฐานข้อมูล ซึ่งนั่นจะอยู่ในวัตถุประสงค์การจัดทำฐานข้อมูลอยู่แล้ว แต่ลองลงรายละเอียดไปในแต่ละเรื่องจากงานที่ทำ เช่น เดือนที่แล้ว สินค้าชนิดใดขายดีที่สุด? จำนวนหน่วยเท่าไหร่? กำไรต่อหน่วยเท่าไหร่? พอได้คำถามที่ต้องการแล้ว ก็จะรู้ว่า ควรทำเขตข้อมูลแบบไหน เพื่อจะได้นำมาสู่การหาคำตอบที่ต้องการ

ข้อมูลมีความเกี่ยวข้องกันหรือไม่?

เมื่อมีวัตถุประสงค์ในการใช้งานที่ชัดเจน มีข้อมูลที่ต้องการเก็บไว้ว่ามีอะไรบ้าง ก็มาตั้งคำถามว่า ข้อมูลต่าง ๆ ที่จะเก็บ จะจัดกลุ่มรวมไว้ในหมวดหมู่ใดบ้าง? สิ่งเหล่านี้ คือการจัดการข้อมูลให้มีระเบียบชัดเจนว่า แต่ละ หมวดหมู่ หรือ แต่ละกลุ่ม มีเพื่ออะไร เช่น กลุ่มข้อมูลที่เกี่ยวกับลูกค้า คือเก็บข้อมูลของลูกค้าแต่ละราย ที่อยู่ติดต่อ หรืออะไรอื่นที่เกี่ยวกับลูกค้า ให้รวมกลุ่มให้เหลือกลุ่มน้อยที่สุดจะเป็นการดี

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

ทำงานกับตาราง

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

คีย์หลัก (Primary Key)

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

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

ลองนึกถึง คีย์หลัก กับ เลขบัตรประจำตัวประชาชน ก็ได้ สิ่งนี้จะอยู่ติดตัวเราไปจนตาย ไม่ว่าเราจะเปลี่ยนคำนำหน้านาม เปลี่ยนชื่อ เปลี่ยนนามสกุล เปลี่ยนศาสนา แต่เลขบัตรฯ ยังเป็นเลขเดิมตลอดเวลา ถ้าจะมีการแก้ไขเลขบัตรประชนชน หมายถึงมีสิ่งผิดพลาดอะไรเกิดขึ้นสักอย่าง เช่นบันทึกเลขผิด ซึ่งการแก้ไขเปลี่ยนแปลงก็ยุ่งยากพอสมควร ไม่ใช่นึกอยากจะเปลี่ยนก็เปลี่ยนได้เลย คีย์หลัก หรือ primary key ก็เป็นแบบนี้เช่นกัน คือ ต่อให้รายละเอียดของสินค้าหรือบุคคลเปลี่ยนแปลง แต่คีย์หลักยังคงเป็นตัวแทนของสิ่งนั้นอยู่

ในกรณีที่ไม่รู้จะเลือกคอลัมน์ไหนเป็นคีย์หลัก หรือ ไม่มีวิธีการสร้างคีย์หลักที่เหมาะสม การใช้ AutoNumber ก็เปลี่ยนทางเลือกหนึ่งที่สามารถเลือกใช้ได้

ความสัมพันธ์ระหว่างตาราง

สำหรับ Access จะมีความสัมพันธ์ระหว่างตารางมี 3 แบบ ซึ่งในครั้งนี้จะยังไม่เขียนถึงอย่างละเอียด เพราะจะมีการพูดถึงอีกครั้งตอนเขียนถึงการสร้างตารางและการสร้างความสัมพันธ์ระหว่างตาราง

ตัวอย่างความสัมพันธ์ของแต่ละตาราง จากฐานข้อมูล Northwinds
  • One-to-One หรือ 1-ต่อ-1 เป็นความสัมพันธ์ที่มีการจับคู่เพียงแค่ฝ่ายละ 1 ระเบียนเท่านั้น ในบางกรณี เราเอาจจะทำตารางเสริม หรือ ตารางแยกเพื่อเชื่อมข้อมูลอื่น
  • One-to-Many หรือ 1-ต่อ-กลุ่ม เป็นความสัมพันธ์ที่มีการจับคู่ของฝ่ายหนึ่งมีเพียง 1 ระเบียน แต่จับคู่กับอีกตารางหนึ่งหลายระเบียน เช่น พนักงานขายหนึ่งคน จับคู่กับการขายสินค้าได้หลายรายการ
  • Many-to-Many หรือ กลุ่ม-ต่อ-กลุ่ม เป็นความสัมพันธ์ที่มีการจับคู่ของแต่ละฝ่ายหลายระเบียน เช่น สินค้าหลายชนิด สามารถไปอยู่ในหลายคำสั่งซื้อ และ คำสั่งซื้อมากกว่า 1 คำสั่งซื้อ ที่จะไปจับกับสินค้าหลายชนิด ซึ่ง ส่วนใหญ่ จะใช้การแก้ปัญหาความสัมพันธ์แบบนี้ด้วยการสร้าง ตารางขึ้นมาอีก 1 ตารางสำหรับการเชื่อมโยงความสัมพันธ์

สรุปคำแนะนำสำหรับการออกแบบตาราง

ลองตั้งคำถามกับตัวเองว่า ข้อมูลนั้นควรอยู่ในตารางหรือไม่

มีเขตข้อมูลที่ไม่จำเป็นหรือไม่ เช่น เป็นเขตข้อมูลที่เกิดจากการคำนวณหรือหาได้จากเขตข้อมูลที่มีอยู่ แบบนี้ก็ไม่จำเป็นต้องเก็บไว้ในตาราง

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

เขตข้อมูลมีมากเกินไปหรือเปล่า? จำนวนระเบียนในตารางนั้นน้อยไปหรือเปล่า? แต่ละระเบียนมีเขตข้อมูลที่มีค่าว่างเยอะหรือไม่? ถ้าเป็นแบบนี้ แนะนำให้ออกแบบตารางใหม่ที่เขตข้อมูลที่น้อยลงและมีจำนวนระเบียนในแต่ละตารางมากขึ้น

เขตข้อมูลที่มี แบ่งเป็นส่วนเล็กที่สุดแล้วใช่หรือไม่ (และข้อมูลนั้นยังใช้ประโยชน์ได้ด้วยนะ) การจัดทำรายงาน จัดเรียง ค้นหา หรือคำนวณข้อมูล ขึ้นอยู่กับข้อมูลแต่ละรายการ การแบ่งส่วนที่เล็กจะช่วยให้ทำงานอย่างละเอียดมากขึ้น เช่น ตำบล อำเภอ จังหวัด ไม่ควรใส่ใน field เดียวกัน แต่ควรแยกเป็น 3 field คือ ตำบล อำเภอ จังหวัด เพื่อจะได้นำมาจัดเรียง ค้นหา หรือทำรายงานสรุปตามพื้นที่ได้ง่าย

เขตข้อมูลนั้นมีความเกี่ยวพันกับตารางหรือเปล่า ถ้าไม่เกี่ยวกับตาราง แสดงว่าเขตข้อมูลดังกล่าวควรอยู่ในตารางอื่น เช่น เขตข้อมูล ชื่อสินค้า ไม่ควรไปอยู่ในตาราง พนักงาน

ความสัมพันธ์แบบ หนึ่ง-ต่อ-หนึ่ง และ หนึ่ง-ต่อ-กลุ่มต้องการคอลัมน์ทั่วไปในการเชื่อมโยงความสัมพันธ์ แต่ความสัมพันธ์แบบ กลุ่ม-ต่อ-กลุ่มจำเป็นต้องมีตารางที่สามมาช่วยเชื่อมความสัมพันธ์