- Natural key คือคีย์ที่ใช้เพื่อรับประกันความเป็นเอกลักษณ์ในฐานข้อมูล
- Natural key อ้างอิงจากข้อมูลจริง เช่น ชื่อ เมือง ปี เป็นต้น
- ตัวอย่างเช่น ในฐานข้อมูลร้านอาหารที่ดีที่สุด 50 แห่งของโลก อาจใช้
restaurantName, cityName, year เป็น natural key ได้
- อย่างไรก็ตาม natural key อาจไม่สามารถรับประกันความเป็นเอกลักษณ์ได้ เช่น อาจมีร้านอาหารชื่อเดียวกันอยู่ในหลายเมือง
อัตลักษณ์
- นอกจากการรับประกันความเป็นเอกลักษณ์แล้ว natural key ยังต้องรับประกันอัตลักษณ์ด้วย
- ตัวอย่างเช่น อาจใช้หมายเลขตัวถังรถหรือหมายเลขประจำตัวบุคคล (CPR number) เป็น natural key ได้
- แต่บุคคลคนเดียวกันอาจมีหมายเลขประจำตัวหลายหมายเลขได้ ตัวอย่างเช่น ในเดนมาร์ก ผู้ที่เปลี่ยนเพศอาจได้รับหมายเลข CPR ใหม่
ข้อผิดพลาดในเอกสาร
- Natural key เปราะบางต่อข้อผิดพลาดในเอกสาร
- อาจเกิดข้อผิดพลาดจากการป้อนข้อมูล การพิมพ์ผิดของผู้ใช้ หรือความผิดพลาดจากการแปลงข้อมูล
- ระบบควรต้องสามารถแก้ไขข้อผิดพลาดเหล่านี้ได้ ดังนั้นการใช้คีย์ภายนอกเป็นคีย์ของฐานข้อมูลจึงไม่เหมาะสม
บทสรุป
- การใช้ natural key ในการออกแบบฐานข้อมูลไม่ใช่แนวคิดที่ดี
- ข้อมูลอาจเกิดความผิดพลาดได้ และต้องสามารถแก้ไขข้อผิดพลาดเหล่านั้นได้
- ดังนั้นจึงควรใช้ surrogate key ในตารางฐานข้อมูลเสมอ
ความเห็นของ GN⁺
- ปัญหาของ natural key: natural key อาจไม่สามารถรับประกันทั้งความเป็นเอกลักษณ์และอัตลักษณ์ได้ และยังเปราะบางต่อข้อผิดพลาดจากการป้อนข้อมูล
- ข้อดีของ surrogate key: surrogate key รับประกันทั้งความเป็นเอกลักษณ์และอัตลักษณ์ และช่วยให้แก้ไขข้อผิดพลาดของข้อมูลได้ง่าย
- ข้อควรพิจารณาเมื่อใช้ ORM: เมื่อใช้ไลบรารี ORM การใช้ surrogate key มักทำได้ง่ายกว่า เพราะ ORM กำหนดโครงสร้างฐานข้อมูลบางส่วนไว้แล้ว จึงมีประสิทธิภาพกว่าหากใช้ surrogate key
- ผลิตภัณฑ์ที่มีความสามารถคล้ายกัน: เครื่องมือออกแบบฐานข้อมูลหรือไลบรารี ORM อื่น ๆ ก็แนะนำให้ใช้ surrogate key เช่น Hibernate, Entity Framework เป็นต้น
- สิ่งที่ควรพิจารณาเมื่อนำเทคโนโลยีมาใช้: เมื่อนำรูปแบบการออกแบบฐานข้อมูลใหม่มาใช้ ควรพิจารณาข้อเสียของ natural key และเลือกใช้ surrogate key จะดีกว่า เพราะช่วยรับประกันความถูกต้องสมบูรณ์ของข้อมูลและแก้ไขข้อผิดพลาดได้ง่าย
2 ความคิดเห็น
ความคิดเห็นบน Hacker News
cus_MJA953cFzEuO1zที่ Stripe ใช้ และยังมีวิธีสร้างด้วย JavaScript/TypeScriptขอแนะนำให้ใช้ TSID สำหรับคีย์เทียมเช่นกัน เพราะมันเตรียมพร้อมรองรับสภาพแวดล้อมแบบกระจายอย่าง global region ได้ด้วย ผมใช้ TSID เป็น PK ใน MySQL และ DynamoDB
https://jsonobject.hashnode.dev/using-tsid-as-database-pk