2012-03-20 43 views
11

đây là hai bảng của tôi về mối quan tâm:chìa khóa composite như chính nước ngoài (sql)

CREATE TABLE IF NOT EXISTS `tutorial` (
    `beggingTime` time NOT NULL, 
    `day` varchar(8) NOT NULL, 
    `tutorId` int(3) NOT NULL, 
    `maxMembers` int(2) NOT NULL, 
    `minMembers` int(1) NOT NULL, 
    PRIMARY KEY (`beggingTime`,`day`,`tutorId`), 
    KEY `tutorId` (`tutorId`) 
) 


CREATE TABLE IF NOT EXISTS `group` (
    `groupId` tinyint(3) NOT NULL AUTO_INCREMENT, 
    `status` varchar(20) NOT NULL, 
    `groupName` varchar(50) NOT NULL, 
    PRIMARY KEY (`groupId`) 
) 

Tôi muốn tạo ra một lĩnh vực trong 'nhóm' đó sẽ liên kết đến các phím độc đáo tổng hợp trong 'hướng dẫn'. Vì vậy, tôi đoán câu hỏi của tôi là, làm cách nào để tôi liên kết các bảng này? sao tôi phải tạo trường khóa ngoài trong 'nhóm' cho mỗi khóa chính trong 'hướng dẫn'?

+0

bạn có muốn mối quan hệ 1: 1, 1: n, n: 1 hoặc n: m không? tức là có bao nhiêu hướng dẫn cho số lượng nhóm? – Aprillion

Trả lời

19

Per the mySQL documentation bạn sẽ có thể thiết lập ánh xạ khóa ngoài cho vật liệu tổng hợp, điều này sẽ yêu cầu bạn tạo nhiều cột.

Thêm các cột và đặt điều này trong group bảng

FOREIGN KEY (`beggingTime`,`day`,`tutorId`) 
    REFERENCES tutorial(`beggingTime`,`day`,`tutorId`) 

Như Steven đã ám chỉ trong các ý kiến ​​dưới đây, bạn nên cố gắng tái kiến ​​trúc sư này để các bảng hướng dẫn sử dụng một khóa chính thực tế (ngay cả khi nó chỉ là một chìa khóa thay thế danh tính). Điều này sẽ cho phép hiệu suất cao hơn khi SQL được xây dựng cho loại mối quan hệ này, không phải là kết hợp.

+2

Trong khi có thể, điều này đã có một hình phạt nghiêm trọng về hiệu suất. Các khóa chính được ánh xạ tới khóa ngoại là khá nhiều tiêu chuẩn của ngành. –

+0

@SteveWellens Cảm ơn, tôi đã cập nhật câu trả lời của tôi dựa trên nhận xét của bạn, vì bạn nói đúng và tôi nên đề cập rằng cùng với câu trả lời trực tiếp ở địa điểm đầu tiên –

+2

CẢNH BÁO: Các cột được tham chiếu phải theo cùng thứ tự mà khóa được tạo ra. Để có được thứ tự đúng, nhấn chuột phải vào khóa ngoài (bên dưới thư mục khóa khi bạn mở rộng bảng trong SSMS) và tập lệnh tạo vào clipboard. Dán. Đảm bảo các cột được tham chiếu của bạn theo thứ tự giống như khóa của bạn. – Trevor

0

1] viết lại bảng đầu tiên: bằng cách đặt tutorId trước tiên, nó tự động là một khóa tất cả bởi chính nó. Trên thực tế, tất cả trừ cột cuối cùng của cột tổng hợp sẽ trở thành một khóa.

CREATE TABLE IF NOT EXISTS `tutorial` (
`beggingTime` time NOT NULL, 
`day` varchar(8) NOT NULL, 
`tutorId` int(3) NOT NULL, 
`maxMembers` int(2) NOT NULL, 
`minMembers` int(1) NOT NULL, 
PRIMARY KEY mykey (`tutorId`,`beggingTime`,`day`) 
) 

2] Có quá nhiều chỉ mục rất đắt đối với các bảng viết nặng. Vì vậy, hãy xem xét một trường bổ sung trong hướng dẫn để sử dụng như một khóa ngoại; có lẽ một record_id auto_increment. Cho nó một vài suy nghĩ.

Các vấn đề liên quan