mySQL中的关系(外键)

时间:2016-05-02 11:14:44

标签: mysql foreign-key-relationship

我作为一个整体来自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中的列聚集在一起,并构建一个视图?我觉得我错过了一些外键来建立表之间的关系,但我的老师告诉我。

感谢您提供任何帮助或提示。

1 个答案:

答案 0 :(得分:0)

表中的外键&列表到引用的表和列列表表示第一个表中每个列表中的值的子行在其列表的第二个表中显示为值的子行。如果是这样,请告诉DBMS外键。虽然如果您声明外键T1 L1引用T2 L2和T2 L2引用T3 L3,那么您不需要声明从T1到T3必须存在的外键,因为执行前两个的DBMS强制执行最后一个。

外键是约束。他们告诉DBMS不能出现某些数据库状态。它们与查询无关。

一个表包含一些行,这些行使一些谓词(由列名参数化的语句模板)为true。表的连接包含使表的谓词为真的行。表的WHERE 条件限制包含使表的谓词与条件进行AND运算的行。要查询,请找到您想要满足行的谓词,并写入相应的关系表达式。

我怀疑“在混合中添加太多外键”是你试图说“选择不属于列的参数化谓词”。例如,在您的设计中,根据您的专栏和候选人密钥声明,教师只教授一门课程。如果这不是您想要的,那么您的列和/或候选键声明不会反映您的谓词和/或您的谓词无法表达可能出现的情况。例如,对于零或多个课程的教学:您声明的候选键StaffID对于给定的列不能正确,如果您希望StaffID成为候选键(这是更好的设计),那么必须从员工表中删除CourseTaught,您必须还有另一张StaffID& amp; CourseTaught。模式设计涉及查找足够的非冗余谓词/表来描述任何情况。 (然后我们规范化以简化设计。)