2016-05-02 366 views
0

作爲一個整體,我在mySQL中是一個初學者,但是我在使用mySQL查看/理解外鍵和關係時遇到了特殊的問題。mySQL中的關係(外鍵)

我正在玩的數據庫基於大學。有關於學生,工作人員,課程,註冊,房間和校園信息的表格。最終,我想要做的是創建一個視圖,使我能夠看到學生缺少什麼課程,但爲了做到這一點,我認爲我首先需要創建一個臨時表,將Student表和Register表連接起來一起。在這張臨時表中,我將會有學生的姓名,課程名稱和註冊信息缺席,存在等)。

我的導師告訴我,因爲關係是雙向流動的,並且可以通過與其他表格的關係進行訪問,所以我需要警惕將過多的外鍵添加到混合中。這裏是我當前的表結構:

表:

CREATE TABLE IF NOT EXISTS `campus` (
    `CampusID` int(8) NOT NULL AUTO_INCREMENT, 
    `CampusName` varchar(255) NOT NULL, 
    `CampusCourses` int(8) NOT NULL, 
    PRIMARY KEY (`CampusID`), 
    KEY `CampusCourses` (`CampusCourses`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Holds attributes relating to the campuses within the college' AUTO_INCREMENT=8 ; 

CREATE TABLE IF NOT EXISTS `course` (
    `CourseID` int(8) NOT NULL AUTO_INCREMENT, 
    `CourseName` varchar(255) NOT NULL, 
    `CourseType` varchar(10) NOT NULL, 
    PRIMARY KEY (`CourseID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Holds attributes relating to the courses offered by the college' AUTO_INCREMENT=21 ; 

CREATE TABLE IF NOT EXISTS `register` (
    `RegisterID` int(8) NOT NULL AUTO_INCREMENT, 
    `RegisterType` enum('Present','Absent','Late','Reason','Left Early') NOT NULL, 
    `RoomLocation` int(8) NOT NULL, 
    `CourseAssociated` int(8) NOT NULL, 
    PRIMARY KEY (`RegisterID`), 
    KEY `CourseAssociated` (`CourseAssociated`), 
    KEY `RoomLocation` (`RoomLocation`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Holds attributes relating to the Student Register' AUTO_INCREMENT=10 ; 

CREATE TABLE IF NOT EXISTS `room` (
    `RoomID` int(8) NOT NULL AUTO_INCREMENT, 
    `RoomType` varchar(255) NOT NULL, 
    `RoomNumber` varchar(6) NOT NULL, 
    `RegisterValue` int(8) NOT NULL, 
    PRIMARY KEY (`RoomID`), 
    KEY `RegisterValue` (`RegisterValue`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Holds attributes relating to the rooms available at the college' AUTO_INCREMENT=23 ; 

CREATE TABLE IF NOT EXISTS `staff` (
    `StaffID` int(8) NOT NULL AUTO_INCREMENT, 
    `StaffFirstName` varchar(255) NOT NULL, 
    `StaffLastName` varchar(255) NOT NULL, 
    `StaffGender` varchar(30) NOT NULL, 
    `StaffPhone` varchar(11) NOT NULL, 
    `StaffAddress` varchar(510) NOT NULL, 
    `CourseTaught` int(8) NOT NULL, 
    PRIMARY KEY (`StaffID`), 
    KEY `CourseTaught` (`CourseTaught`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Holds attributes relating to staff members at the college' AUTO_INCREMENT=30 ; 

CREATE TABLE IF NOT EXISTS `student` (
    `StudentID` int(8) NOT NULL AUTO_INCREMENT, 
    `StudentFirstName` varchar(255) NOT NULL, 
    `StudentLastName` varchar(255) NOT NULL, 
    `StudentGender` varchar(30) NOT NULL, 
    `StudentPhone` varchar(11) NOT NULL, 
    `StudentAddress` varchar(510) NOT NULL, 
    `CourseTaken` int(8) NOT NULL, 
    PRIMARY KEY (`StudentID`), 
    KEY `CourseTaken` (`CourseTaken`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Holds attributes relating to students at the college' AUTO_INCREMENT=21 ; 

約束:

ALTER TABLE `campus` 
    ADD CONSTRAINT `campus_ibfk_1` FOREIGN KEY (`CampusCourses`) REFERENCES `course` (`CourseID`) ON DELETE NO ACTION ON UPDATE CASCADE; 

ALTER TABLE `register` 
    ADD CONSTRAINT `register_course_fk` FOREIGN KEY (`CourseAssociated`) REFERENCES `course` (`CourseID`) ON DELETE NO ACTION ON UPDATE CASCADE, 
    ADD CONSTRAINT `register_room_fk` FOREIGN KEY (`RoomLocation`) REFERENCES `room` (`RoomID`) ON DELETE NO ACTION ON UPDATE CASCADE; 

ALTER TABLE `room` 
    ADD CONSTRAINT `room_register_fk` FOREIGN KEY (`RegisterValue`) REFERENCES `register` (`RegisterID`) ON DELETE NO ACTION ON UPDATE CASCADE; 

ALTER TABLE `staff` 
    ADD CONSTRAINT `staff_course_fk` FOREIGN KEY (`CourseTaught`) REFERENCES `course` (`CourseID`) ON DELETE NO ACTION ON UPDATE CASCADE; 

ALTER TABLE `student` 
    ADD CONSTRAINT `student_course_fk` FOREIGN KEY (`CourseTaken`) REFERENCES `course` (`CourseID`) ON DELETE NO ACTION ON UPDATE CASCADE; 

我的問題是,如何建立從student.FirstName, student.LastName, course.CourseName, register.RegisterType收集列在一起,一個臨時表,並建立一個在附近查看?我覺得我錯過了一些外鍵來建立表格之間的關係,但是我的老師告訴我不然。

感謝您提供任何幫助或提示。

+0

「雙向流動的關係」是什麼意思?除非「關係」被視爲「關係」或「關聯」,否則我無法理解它,但是您也將「關係」用於「外鍵」。 – philipxy

回答

0

列表&列表中的外鍵到被引用的表和列列表中,第一個表中的列的值的每個列表在其列表中顯示爲第二個表中每個列表的值的子行。如果是這樣,請告訴DBMS外鍵。雖然如果您聲明引用T2 L2和T2 L2的外鍵T1 L1 L1引用T3 L3,則不需要聲明從T1到T3必須存在的外鍵,因爲執行前兩個操作的DBMS強制執行最後一個。

外鍵是約束。他們告訴DBMS某些數據庫狀態不能出現。他們與查詢無關。

一個表包含使某些謂詞(按列名稱參數化的語句模板)爲true的行。表的連接包含使表的謂詞的AND爲真的行。 A WHERE 條件表的限制包含使表的謂詞與條件爲真的行。要進行查詢,請找到您想要滿足的行的謂詞並編寫相應的關係表達式。

我懷疑「在混合中添加太多外鍵」是您試圖說「選擇不屬於列的參數化謂詞」。例如,在您的設計中,根據您的專欄和候選人的關鍵聲明,講師只會教授一門課程。如果這不是你想要的,那麼你的列和/或候選鍵聲明不能反映你的謂詞和/或你的謂詞不能表達可能出現的情況。例如,爲了教授零個或多個課程:對於給定的列,您聲明的候選關鍵StaffID不可能是正確的,並且如果您希望StaffID成爲候選鍵(這是更好的設計),則CourseTaught必須從教職員表中刪除,並且您必須另外一張桌子上有StaffID & CourseTaught。模式設計涉及找到足夠的非冗餘謂詞/表來描述任何情況。 (然後我們正常化來簡化設計。)