Я очень новичок в 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
, и построить посмотреть вокруг этого? Я чувствую, что мне не хватает внешних ключей, чтобы строить отношения между таблицами, но мой инструктор говорит мне иначе.
Благодарим за любую помощь или подсказки, которые вы можете предложить.
Что означает «отношения в обоих направлениях»? Я не могу понять это, если «отношения» не воспринимаются как «отношение» или «ассоциация», как в том, что представляет таблица, но вы также используете «отношения» для «внешнего ключа». – philipxy