ใครที่เคยเรียนระบบฐานข้อมูลกันมาคงเคยได้ยินผ่านหูกันมาว่าการใช้ Foreign Key เชื่อมความสัมพันธ์ระหว่างตารางนั้นจะช่วยให้ข้อมูลมีความถูกต้องสมบูรณ์อยู่เสมอ แต่จนแล้วจนรอดในชีวิตการทำงานของผมมาแปดปี ทำเกี่ยวกับฐานข้อมูลมาก็เยอะก็ยังไม่ได้มีโอกาสใช้ Foreign Key ที่อุตส่าห์ล่ำเรียนมาเลย พอมีคนพูดถึงเรื่องนี้ในระบบย้ายฐานข้อมูลของ Github เอง ย้ำของ Github ไม่ใช่โปรเจคไก่กาบน Github เลยเอามาแชร์ให้ทุกคนคิดต่อกันดังนี้
- FK ทำให้ฐานข้อมูลนั้นแบ่งแยกกัน แอพที่ใช้ FK เป็นประจำเพื่อรักษาความสมบูรณ์แทนที่จะทำด้วยตัวเอง อาจจะใช้ on cascade delete ทำให้เมื่อต้องแบ่งแยกข้อมูลบางส่วนออกไป จะต้องทำการทดสอบแอพใหม่หมดโดยไม่รู้ว่าจะเจอพฤติกรรมแปลกๆ อะไรหรือเปล่า
- FK ส่งผลต่อประสิทธิภาพฐานข้อมูลมาก ถ้าแค่ทำอินเด็กซ์ยังพอไหว แต่ถ้าจะต้องไปไล่ตามเพิ่มลบที่อื่นด้วยก็ยากกว่า
- FK นั้นทำไม่ได้เลยถ้าจะมีการปรับโครงสร้างฐานข้อมูลแบบออนไลน์ที่ฐานข้อมูลยังมีการใช้งานอยู่
ข้อสุดท้ายตัวอย่างก็คือ ถ้ามีตารางแม่และตารางลูกมี FK ต่อกัน ถ้าจะเปลียนชื่อตารางแม่ไปแล้ว FK ก็จะย้ายชื่อตารางใหม่ด้วย แล้วตารางแม่ที่ปรับมาใหม่ก็จะยังไม่ซิงค์กับตารางลูกอยู่ดี เพราะเป็นไปไม่ได้ที่ตารางลูกจะมี FK เชื่อมไปทั้งตารางเก่าและตารางใหม่ ทำให้เสียความสมบูรณ์ข้อมูลของตารางลูกไปบางส่วน