在數(shù)據(jù)庫設(shè)計(jì)中,經(jīng)常會遇到一張表需要與多張表進(jìn)行關(guān)聯(lián)的情況。MySQL提供了多種方式來實(shí)現(xiàn)這個需求。
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表都通過外鍵關(guān)聯(lián)到users表。
另外一種實(shí)現(xiàn)方式是使用聯(lián)結(jié)表(junction table)。聯(lián)結(jié)表通常用于實(shí)現(xiàn)多對多的關(guān)系,其設(shè)計(jì)和用法也很簡單。例如:
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表就是聯(lián)結(jié)表,用來關(guān)聯(lián)students表和courses表。可以通過enrollments表查詢每個學(xué)生選修的課程,或者查詢每個課程里有哪些學(xué)生參加。