มีการแลกเปลี่ยนหลายอย่างที่นี่ จริงๆแล้วฉันใช้สตริงคีย์บ่อย ๆ แต่บ่อยครั้งที่ฉันรวมคีย์รองตัวแทนสำหรับการเข้าร่วม (เห็นได้ชัดว่ามันจะเป็นวิธีอื่นถ้าฉันใช้ MySQL) มีหลายกรณีที่ฉันทำไม่ได้
ก่อนอื่นฉันเป็นแฟนตัวยงของการประกาศคีย์ธรรมชาติเป็นคีย์หลักที่ db สามารถจัดการกับบ่อน้ำได้ (ตัวอย่างเช่น PostgreSQL) สิ่งนี้ช่วยในการทำให้เป็นมาตรฐานและทำให้การออกแบบฐานข้อมูลชัดเจนขึ้น ปุ่มตัวแทนทำให้การเข้าร่วมง่ายขึ้น
มีสองเหตุผลที่ฉันมักจะเพิ่มกุญแจตัวแทน:
ไม่ชัดเจนว่าคีย์ธรรมชาติคืออะไรเสมอไป บางครั้งสิ่งเหล่านี้จะต้องมีการเปลี่ยนแปลง การเปลี่ยนคีย์ธรรมชาติแบบรวมเมื่อใช้สำหรับการรวมและการอ้างอิงที่สมบูรณ์มีความซับซ้อนและเกิดข้อผิดพลาดได้ง่าย
การเข้าร่วมประสิทธิภาพของคีย์คอมโพสิตนั้นเป็นปัญหาและเมื่อคุณไปตามเส้นทางคีย์ธรรมชาติคุณจะติดอยู่ที่นั่น
ในกรณีที่คีย์ธรรมชาติคือนิยามคอลัมน์เดียวและข้อความอย่างไรก็ตามฉันมักจะเข้าร่วมในคีย์สตริง เหตุผลของฉันในการทำเช่นนี้คือการหลีกเลี่ยงการเข้าร่วมในการค้นหา การใช้งานบ่อยที่สุดคือการให้การออกแบบฐานข้อมูลที่เหมาะสมรอบกรณีการใช้งานของประเภท enum ในกรณีส่วนใหญ่สิ่งเหล่านี้ไม่จำเป็นต้องมีการเข้าร่วมเพิ่มเติมสำหรับการสืบค้นปกติ ดังนั้นในกรณีนี้คีย์สตริงเช่นเดียวกับคีย์เข้าร่วมจึงเหมาะสมอย่างยิ่ง
ตัวอย่างเช่นใน LedgerSMB เราจัดเก็บหมวดหมู่บัญชี สิ่งเหล่านี้จะถูกระบุโดยการอ้างอิงสตริงและข้อมูลอื่น ๆ บางอย่างจะถูกเก็บไว้พร้อมกับการอ้างอิงสตริงที่ใช้ในการบังคับใช้กฎระเบียบเกี่ยวกับการรวมกันของหมวดหมู่ที่สามารถส่งผลกระทบต่อบัญชี เวลาเดียวที่จำเป็นต้องใช้ตรรกะคือเมื่อบันทึกชุดของหมวดหมู่เพื่อให้เราเข้าร่วมในคีย์สตริง
เหตุใดค่าเริ่มต้นจะเป็นคีย์จำนวนเต็มฉันไม่คิดว่ามันเป็นแค่คำถามของขนาดดัชนี ปัญหาใหญ่คือการจัดการของคีย์ เนื่องจากคีย์นั้นเป็นกฎเกณฑ์และคุณอาจต้องรับมือกับบันทึกนับล้านรายการคุณต้องมีวิธีในการสร้างสตริงที่ไม่ซ้ำกัน มีหลายกรณีที่ผู้คนใช้ UUID สำหรับสิ่งนี้ แต่มีโอกาสที่ไม่ใช่ศูนย์ของการชนกันของ UUID และที่จัดเก็บเร็กคอร์ดหลายพันล้านรายการโอกาสนี้สูงพอที่คน ๆ หนึ่งจะเห็นจริงในขณะที่โอกาสชนกับประเภทจำนวนเต็มเพิ่มขึ้นเป็นศูนย์ ตามคำจำกัดความ