Giả sử chúng tôi tiếp tục sử dụng id
Auto Increment làm Khóa chính. Bây giờ, chúng tôi cũng sẽ cần đảm bảo rằng dữ liệu nhất quán, tức là , không có hàng trùng lặp nào cho sự kết hợp của (student_id, course_id)
các giá trị. Vì vậy, chúng tôi sẽ cần phải xử lý điều này trong mã ứng dụng (thực hiện chọn mỗi lần trước khi chèn / cập nhật) hoặc chúng tôi có thể khắc phục điều này theo cấu trúc bằng cách xác định một UNIQUE
hỗn hợp ràng buộc về (student_id, course_id)
.
Bây giờ, một Khóa chính về cơ bản là một Khóa KHÔNG ĐẦY ĐỦ. Nếu bạn nhìn vào định nghĩa bảng của mình, ràng buộc UNIQUE mới được xác định này về cơ bản chỉ là Khóa chính (vì các trường cũng KHÔNG ĐẦY ĐỦ). Vì vậy, trong trường hợp cụ thể này, bạn không thực sự cần sử dụng khóa chính thay thế id
.
Sự khác biệt về tổng chi phí trong quá trình DML ngẫu nhiên (Chèn / Cập nhật / Xóa) sẽ là tối thiểu, vì bạn cũng sẽ có tổng chi phí tương tự khi chỉ sử dụng chỉ mục DUY NHẤT. Vì vậy, bạn có thể xác định một Khóa tổng hợp chính tự nhiên (student_id, course_id)
:
-- Drop the id column
ALTER TABLE students_courses DROP COLUMN id;
-- Add the composite Primary Key
ALTER TABLE students_courses ADD PRIMARY(student_id, course_id);
Ở trên cũng sẽ thực thi ràng buộc DUY NHẤT đối với sự kết hợp của (student_id, course_id)
. Hơn nữa, bạn sẽ tiết kiệm được 4 byte mỗi hàng (kích thước của int
là 4 byte). Điều này sẽ hữu ích khi bạn có các bảng lớn.
Bây giờ, trong khi tham gia từ students
tới students_courses
bảng, phía trên Khóa chính sẽ là một chỉ mục đủ. Tuy nhiên, nếu bạn cần tham gia từ courses
tới students_courses
bảng, bạn sẽ cần một khóa khác cho mục đích này. Vì vậy, bạn có thể xác định thêm một khóa trên course_id
như sau:
ALTER TABLE students_courses ADD INDEX (course_id);
Hơn nữa, bạn nên xác định các ràng buộc Khoá ngoại để đảm bảo tính toàn vẹn của dữ liệu:
ALTER TABLE students_courses ADD FOREIGN KEY (student_id)
REFERENCES students(student_id);
ALTER TABLE students_courses ADD FOREIGN KEY (course_id)
REFERENCES courses(course_id);