在数据库设计中,经常会遇到一张表需要与多张表进行关联的情况。MySQL提供了多种方式来实现这个需求。
CREATE TABLE `users` ( `user_id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `password` VARCHAR(50) NOT NULL, `email` VARCHAR(100) NOT NULL, PRIMARY KEY (`user_id`) ); CREATE TABLE `orders` ( `order_id` INT(11) NOT NULL AUTO_INCREMENT, `user_id` INT(11) NOT NULL, `product_name` VARCHAR(50) NOT NULL, `quantity` INT(11) NOT NULL, PRIMARY KEY (`order_id`), FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ); CREATE TABLE `payments` ( `payment_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `amount` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`payment_id`), FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`) );
以上是一个简单的例子,包含了三个表:users、orders、payments。orders表和payments表都通过外键关联到users表。
另外一种实现方式是使用联结表(junction table)。联结表通常用于实现多对多的关系,其设计和用法也很简单。例如:
CREATE TABLE `students` ( `student_id` INT(11) NOT NULL AUTO_INCREMENT, `student_name` VARCHAR(50) NOT NULL, PRIMARY KEY (`student_id`) ); CREATE TABLE `courses` ( `course_id` INT(11) NOT NULL AUTO_INCREMENT, `course_name` VARCHAR(50) NOT NULL, PRIMARY KEY (`course_id`) ); CREATE TABLE `enrollments` ( `enrollment_id` INT(11) NOT NULL AUTO_INCREMENT, `student_id` INT(11) NOT NULL, `course_id` INT(11) NOT NULL, PRIMARY KEY (`enrollment_id`), FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`), FOREIGN KEY (`course_id`) REFERENCES `courses` (`course_id`) );
enrollments表就是联结表,用来关联students表和courses表。可以通过enrollments表查询每个学生选修的课程,或者查询每个课程里有哪些学生参加。