Share this

การกำหนดข้อจำกัดข้อมูลให้ไม่ซ้ำกันด้วย Django Unique Constraint

Issues
April
Programmer
Categories:
#Back-end Tools
Inspired by: Preeti, Natchaya
Views

Constraint คืออะไร ?

 
Constraint เป็นเหมือนกฏหรือข้อบังคับ ที่ใช้งานกับข้อมูลแต่ละคอลัมน์ของตาราง โดย Constraint มีส่วนช่วยในการจำกัดว่าข้อมูลประเภทไหนสามารถอยู่ในตารางได้
 
การใช้งานของ Constraint สามารถใช้งานได้ทั้งในระดับคอลัมน์ หรือในระดับตาราง โดยหากใช้งานกับคอลัมน์ สามารถใช้ได้กับคอลัมน์เดียวเท่านั้น แต่ถ้าใช้งานกับตาราง จะสามารถจัดการข้อมูลทุกคอลัมน์ของตารางได้
 
Constraint มีการทำงานได้หลากหลายรูปแบบ สำหรับบทความนี้เราจะพูดถึง การทำงานพื้นฐานของ Check Constraint และ Unique Constraint ซึ่งเจาะลึกไปถึงการใช้งานของ Unique Constraint กับข้อมูลในระบบ และการกำหนดเงื่อนไขเมื่อมีข้อมูลที่โดน Soft Delete
ตัวอย่างการประกาศ Constraint
​​​​​​​​​​​

Check Constraint

 
Check Constraint คือการประกาศ Constraint ใน Database โดยจะเป็นการจำกัดข้อมูลที่ได้รับการยอมรับให้อยู่ในคอลัมน์ต่างๆ
 
ข้อควรรู้
  • เราสามารถสร้าง Check Constraint ด้วย Boolean Expression ที่จะคืนค่าเป็น True หรือ False ได้
  • เราสามารถสร้าง Check Constraint ได้หลายรายการสำหรับคอลัมน์เดียว และนอกจากนี้ยังสามารถใช้งาน Check Constraint ตัวเดียวสำหรับหลายคอลัมน์ได้
  • Check Constraint นั้นจะคล้ายกับ Foreign Key Constraint เนื่องจากทั้ง 2 อย่างจะควบคุม Value ที่อยู่ในคอลัมน์ โดยมีข้อแตกต่างที่วิธีการในการกำหนดว่า Value ไหนจะ Valid

- Foreign Key Constraint จะกำหนดจาก List ของ Value จากตารางอื่นๆ

- Check Constraint จะกำหนดจาก Value ที่ตั้งไว้ตาม Logical Expression

  • ตัวอย่างการใช้งาน เราสามารถกำหนด  Age Field ให้มากกว่า 18 ปีเสมอ ตามตัวอย่างด้านล่าง
 
ตัวอย่างการใช้งานการกำหนด Check Constraint
 

Unique Constraint

 
Unique Constraint คือกฎที่ SQL Server Database Engine มี โดยสามารถใช้งานเพื่อทำให้มั่นใจได้ว่าจะไม่มีข้อมูลที่ซ้ำกัน (Duplicated Value) ในคอลัมน์ ที่ไม่ใช่ Primay Key อาจเรียกได้ว่านี่คือการกำหนด “Uniqueness” ของข้อมูลนั้นเอง
  • โดยการใช้งาน Unique Constraint สามารถใช้งานได้ทั้งในกรณีที่มีการกำหนด Constraint สำหรับหนึ่งคอลัมน์ หรือมากกว่า
  • นอกจากนี้  Unique Constraint  อนุญาติให้ Value สามารถเป็น Null ได้ โดยจะสามารถมีค่า Null ได้เพียงค่าเดียวต่อหนึ่งคอลัมน์
ตัวอย่างกรณี การทำ Website จองห้องพัก เราอาจต้องการกำหนดว่าแต่ละห้องสามารถจองได้เพียง 1 ครั้งใน 1 วัน โดยสามารถดำเนินการได้ตามตัวอย่างด้านล่าง
 
ตัวอย่างการการกำหนด Unique Constraint
 
สำหรับบทความนี้ เราจะเน้นไปที่การใช้งาน Unique Constraint เป็นหลัก จากภาพด้านล่าง จะเห็นประกาศใช้  Unique Constraint เพื่อตรวจสอบ Uniqueness ของ Field ที่กำหนด ซึ่งในที่นี้คือ Field “document_number”
 
ตัวอย่างการใช้งาน Unqiue Constraint
 

Unique Constraint แบบเจาะลึกขึ้น

Unique Constraint คือการทำงานระดับ Database ที่ทำงานเพื่อป้องกันการซ้ำซ้อนของข้อมูลใน Field (แต่ละคอลัมน์ หรือกลุ่มของคอลัมน์) สำหรับแต่ละ Record จากตารางที่มีการกำหนดว่าค่า Unique = True
 

การ Define Unique Constraint 2 รูปแบบ

 
1. Unique = True จะถือเป็นการกำหนดว่า Field นี้ต้องไม่มีข้อมูลซ้ำ ในกรณีที่มีการบันทึกข้อมูลซ้ำลงใน Database จะไม่สามารทำรายการได้ โดยจะมีการแจ้ง Error เพื่อให้รับทราบ
 
ตัวอย่างการกำหนด unique = true
 
ข้อควรรู้
การทำงานของ Unique = True จะสามารถใช้งานกับ Field ใน Database ได้เกือบทุกประเภท ยกเว้น ManyToManyField และ OneToOneField
 
2. กำหนด Unique Together ใน Meta Class สามารถใช้งานได้มากกว่า 1 Field และในกรณีที่แต่ละ Field มีข้อมูลซ้ำกันจะมี Error
 
หากอธิบายง่ายๆ การใช้ Unique Together จะเป็นการกำหนดว่ากลุ่มของ Field Name ที่ระบุไว้จะต้องไม่ซ้ำเมื่อมีการใช้งานร่วมกัน โดยสามารถกำหนดข้อมูลเป็น “List” ที่ต้องการไม่ให้ซ้ำ (ต้องการให้ Unique) ได้
 
ข้อควรรู้
  • การใช้งาน Unique Together สามารถเป็น “Single List” ได้ เมื่อมีการใช้งานกับกลุ่ม Field เพียงกลุ่มเดียว
  • ManyToManyField จะไม่สามารถใช้งานร่วมกับ Unique Together ได้ ดังนั้นหากต้องการตรวจสอบการซ้ำกัน (Duplicate) ของข้อมูลแบบ ManyToManyField  จะต้องใช้งาน Signal หรือ Through Model
 
ตัวอย่างการกำหนด Unique Together
 
ตัวอย่างการทำงาน
จากภาพตัวอย่างด้านล่าง เมื่อมีการใช้ Unique Constraintโดยกำหนดว่า Field “document_number” จะมี  Unique = True เมื่อมีการสร้าง document_number ครั้งที่ 1 โดยกำหนดให้มีเลขที่เอกสารเป็น “ABC” ผู้ใช้งานสามารถดำเนินการได้ เนื่องจากยังไม่พบข้อมูลซ้ำ
 
อย่างไรก็ตามหากมีการสร้าง document_number ในครั้งถัดไป โดยที่ใช้เลขที่เอกสาร “ABC” เช่นเดียวกับรายการแรก จะไม่สามารถทำรายการได้ และจะมีการแจ้ง Integrity Error
 

ตัวอย่างการทำงานของ Unique Constraint
 
หากสรุปโดยย่อ เมื่อมีการใช้งาน Unique Constraint เมื่อไหร่ จะมีการตรวจสอบการซ้ำกันของข้อมูลตาม Field ที่กำหนดเสมอ และเมื่อพบรายการที่ซ้ำ จะมีการแจ้ง Error และไม่อนุญาตให้ดำเนินการ
 

การใช้ Unique Constraint คู่กับ Soft Deletion

 
Soft Delete คืออะไร?
Soft Delete คือการพยายามลบข้อมูลนจาก Record โดยไม่ใช่การลบข้อมูลออกจาก Database จริง แต่เป็นการที่ตั้ง Flag สำหรับข้อมูลนั้นให้เป็น False เพื่อแสดงว่าข้อมูลนั้นถูกลบไปแล้ว (เหมือนซ่อนเอาไว้)
 
ดังนั้นหากเราใช้ Soft Delete ข้อมูลที่เราเลือกลบอาจจะหายไปจากระบบการทำงาน แต่ยังอยู่ใน Database ซึ่งมีข้อดีที่เราสามารถตรวจสอบประวัติการทำงานได้ และยังสามารถ Revert ข้อมูลที่ถูก Soft Delete กลับมาได้ เพียงแค่แก้ Flag
 
แล้วการใช้งาน Soft Delete ส่งผลต่อการตรวจสอบข้อมูลที่ซ้ำ?
แน่นอนว่ามีผลต่อการทำงาน เพราะถึงแม้ว่ารายการนี้จะถูก Soft Delete ไปอาจถือได้ว่าถูกลบจากระบบแล้ว  แต่จริงๆข้อมูลทั้งหมดยังมีอยู่ใน Database ดังนั้นหากมีการตั้งค่า Unique Constraint ออกไป ข้อมูลที่ถูก Soft Delete ไปแล้วจะถูกรวมอยู่ด้วย และเมื่อมีการสร้างรายการใหม่ ที่มีข้อมูลซ้ำก็จะทำให้เกิด Integrity Error และไม่สามารถดำเนินการต่อได้
 
ซึ่งจะแตกต่างกับการทำ Hard Delete เพราะสำหรับการทำ Hard Delete ข้อมูลนั้นจะถูกลบไปจาก Database อย่างแท้จริง ดังนั้นหากเราต้องการใช้งานโดยที่ไม่รวมข้อมูลที่ถูก Soft Delete ไปแล้ว จะต้องกำหนดเงื่อนไขและใช้ควบคู่กับ Constraint นั่นเอง
 
ตัวอย่างการใช้งาน Unique Constraint กับข้อมูลที่ถูก Soft Delete และ Hard Delete
 
การใช้ unique constraint กับ soft delete โดยการกำหนดเงื่อนไข
เพื่อใช้งาน Constraint โดยที่ไม่รวมข้อมูลที่ถูก Soft Delete ไป ผู้ใช้งานสามารถกำหนดเงื่อนไขเพิ่มเติมได้ โดยการกำหนด “Condition”
 
จากภาพจะเห็นว่าเรากำหนด “Condition=Q(alive=True)” จึงทำให้งดเว้นการตรวจสอบข้อมูลกับข้อมูลที่ถูก Soft Delete ที่จะมีค่า alive=False
 
ดังนั้นเมื่อมีการตรวจสร้างเลขที่เอกสารใหม่ แม้จะซ้ำกับ document_number ที่ถูก Soft Delete ไปแล้วก็จะสามารถสร้างได้ เนื่องจากมีการกำหนดเงื่อนไขไว้แล้วนั่นเอง
 
ตัวอย่างการใช้ Unique Constraint กับ Soft Delete
 

โดยสรุป การใช้งาน Unique Constraint นั้นเป็นประโยชน์อย่างมากต่อการป้องกันและตรวจสอบความซ้ำซ้อนของข้อมูลในระดับ Database นอกจากนี้ยังสามารถจัดการเงื่อนไขการใช้งานได้อย่างละเอียด ทั้งในเรื่องของการตรวจสอบความซ้ำซ้อนในตารางเดียวกัน และการใช้งานในกรณีที่ข้อมูลถูกดำเนินการ Soft Delete ไปแล้ว ถือได้ว่าเป็นเครื่องมือที่มีความจำเป็นอย่างมากต่อการทำงาน

 
ขอบคุณที่มาข้อมูลจาก
Soft Delete-CFwheelsUnique-djangoproject
Unique-djangoproject
Unique constraints and check constraints-Microsoft
Constraints-tutorialspoint
 
You may also like
Low Code Framework ทำงานอย่างไร?
Low Code Framework ทำงานอย่างไร?
SEP 03, 202111 MINUTES AGO READ
Front-end Tools
Back-end Tools
Automated Process
ข้อควรปฏิบัติสำหรับการทำ Server Hardening
ข้อควรปฏิบัติสำหรับการทำ Server Hardening
AUG 20, 2021A DAY AGO READ
Back-end Tools
ว่าด้วยเรื่องการทำ Realtime App
ว่าด้วยเรื่องการทำ Realtime App
JUN 10, 20214 DAYS AGO READ
Back-end Tools
5 ปัจจัยหลัก ที่ใช้ประเมินการทำงาน Developer
5 ปัจจัยหลัก ที่ใช้ประเมินการทำงาน Developer
JUN 04, 202111 DAYS AGO READ
Back-end Tools
Front-end Tools

SUBSCRIBE TO OUR

NEWS
LETTER .

Code , Consult , Communicate

Copyright © 2020 CODIUM Company Limited.