Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chỉ mục tổng hợp cho một bảng quan hệ

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);



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm nạp các hàng trong bảng cơ sở dữ liệu MySQL bằng MySQL C API và C ++

  2. Làm cách nào để làm trễ các cột trong MySQL?

  3. java.sql.SQLException:Giá trị chuỗi không chính xác:'\ xF0 \ x9F \ x91 \ xBD \ xF0 \ x9F ...'

  4. Lỗi Chèn PHP / SQL khi sử dụng Trình giữ chỗ được Đặt tên

  5. Truy vấn SQL trả về tất cả các ngày không được sử dụng trong bảng