การออกแบบ database 1/2 [ Database the series ]

Database the series 5 ธ.ค. 2022

ใน Part นี้จะอธิบายถึง การออกแบบ relational database โดยเนื้อหาที่สำคัญจะเป็นเรื่อง  Functional Dependencies , Design Guidelines กันนะครับบ

เริ่มที่เรื่องแรก การที่เราจะออกแบบ database ให้ดี เผื่อให้เวลาเราใช้งานแล้วไม่เกิดปัญหาต่างๆ เช่น ข้อมูลไม่ครบบ้าง , หายบ้าง หรือ ใช้งานยาก สิ่งที่จะเข้ามาช่วยก็คือ Design Guidelines นั่นเอง

Informal Design Guidelines for Relational Databases

การ design relational database การ จัดกลุ่ม attributes ให้อยู่ในรูปแบบความสัมพันธ์ที่ดี โดย relation schema จะมีอยู่ 2 level
 - The logical level (user view)
 - The storage level (base relation)
โดยในการออกแบบจะเกี่ยวข้องกับ base relation เป็นหลัก โดยการออกแบบชุดความสัมพันธ์ โดยมีเป้าหมายคือ การเก็บรักษาข้อมูล (information preservation) และ ความซ้ำซ้อนต่ำ (minimum redundancy)

GUIDELINE ที่ 1

ในแต่ละ tuple (row) ควรมีเพียง 1 entity หรือ relationship instance หรือก็คือ ใน 1 แถว attributes ในแถวนั้นควรจะนำเสนอเรื่องราวเดียวกัน (entity เดียวกัน) ไม่มีเรื่องอื่นมาเกี่ยวข้อง (entity อื่น) ถ้าจะมี จะต้องใช้ foriegn key reffer ไปหา table อื่น โดยควรแยก entity และ attributes ที่มีความสัมพันธ์ออกจากกันให้มากที่สุด

จากรูปจะเห็นได้ว่า Table EMPLOYEE มี attribute ที่เกี่ยวข้องกับ employee เท่านั้น และ relationship อื่นๆ เช่น DEPARTMENT จะถูกแยกออกมาเป็นอีก 1 table และใช้ Fk reffer หากันแทน

ℹ️
การออกแบบ schema ควรที่จะอธิบายความสัมพันธ์ได้ง่าย

GUIDELINE ที่ 2

ไม่ควรมีการเก็บข้อมูลที่ซ้ำซ้อนกันเนื่องจากจะทำให้เกิดปัญหา
 - เปลืองพื้นที่เก็บ
 - เกิดปัญหา update anomalies
  - Insertion anomalies
  - Deletion anomalies
  - Modification anomalies

anomalies คือ เหตุการณ์ที่ไม่ปกติโดยเกิดได้จากการ Insert , Delete , Update

ตัวอย่าง

จาก relation นี้จะทำให้เกิด

Update Anomaly : เมื่อต้องการเปลี่ยนชื่อ project (Pname) ทำให้ต้องมาไล่เปลี่ยนในทุกๆ row

Insert Anomaly : ไม่สามารถเพิ่ม project ที่ไม่มี employee หรือ เพิ่ม employee ที่ไม่ถูก assign project ได้

Delete Anomaly : เมื่อ project ถูกลบ employee ที่ทำงานอยู่ใน project นั้นทั้งหมดก็จะถูกลบออกไปด้วย

GUIDELINE ที่ 3

ในการออกแบบ relation คสรออกแบบให้ใน tuples มี NULL น้อยที่สุดเท่าที่จะเป็นไปได้ โดย attribute ไหนที่มีโอกาสเป็น NULL บ่อยๆ ควรที่จะถูกแยกออกมาเป็นอีก 1 table

GUIDELINE ที่ 4

ไม่ควรให้เกิด Spurious Tuples หรือก็คือ เมื่อมีการ Join ไม่ควรมีข้อมูลที่ไม่ถูกต้องเกิดขึ้น

ตัวอย่าง

Join 2 table เข้าด้วยกัน คือ EMP_LOCS และ EMP_PROJ1 โดยใช้ Pnumber ในการ join

ผลที่ออกมาคือเกิดข้อมูลที่ไม่ถูกต้อง

ℹ️
สามารถป้องกันได้โดยทำตาม Guildeline ข้อที่ 1

Spurious Tuples

หรือก็คือ tuples ที่ข้อมูลที่ไม่ถูกต้อง ที่เกิดจากการ join ของ table โดยการที่จะป้องกันไม่ให้เกิด spurious tuple สามารถทำได้โดยการ decompositions

โดย
 - ไม่เกิดข้อมูลที่ผิดผลาดหรือเสียข้อมูลจากการ join
 - รักษา functional dependencies

Functional Dependencies

Functional dependencies หรือ FDs เป็นตัวที่ใช้ในการตรวจสอบว่า relational ที่ออกแบบนั้นดีหรือเปล่า และ เป็นตัวในการตัดสินว่าที่ออกแบบอยู่ใน normal form รูปแบบที่เท่าไหร่

โดย กลุ่มของ attribute X functionally determines กลุ่มของ attribute Y ถ้า ค่าของ X สามารถกำหนดค่า Y ได้ เช่น

SSN determines ENAME (รู้ SSN -> รู้ ENAME)
หรือ เมื่อก่อนจะเรียกว่า ENAME depend on SSN

โดยที่ FD คือสมบัติของ attribute ที่อยู่ใน schema นั้นๆ

ถ้า K เป็น key ของ R -> K จะ determines ทุกๆ attribute ใน R

⚠️
การที่จะรู้ FD เราต้องเข้าใจความสัมพันธ์ของ attribute ก่อน

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

Credit

Illustration by Icons 8 from Ouch!

Tags

Witchayut Gerdchai

Software Engineer คนนึง