2016-05-02 28 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。模式设计涉及找到足够的非冗余谓词/表来描述任何情况。 (然后我们正常化来简化设计。)