2016-05-02 4 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

Внешний ключ из таблицы & Список столбцов в таблице таблиц и столбцов, приведенных в таблице, говорит о том, что подныри значений в первой таблице в своем списке отображаются как подначисления значений во второй таблице в своем списке. Если это так, сообщите СУБД о внешнем ключе. Хотя если вы объявляете внешние ключи T1 L1, ссылающиеся на T2 L2 и T2 L2, ссылающиеся на T3 L3, вам не нужно объявлять внешний ключ, который должен существовать от T1 до T3, потому что СУБД, обеспечивающая выполнение первых двух, применяет последнее.

Внешние ключи - это ограничения. Они сообщают СУБД, что определенные состояния базы данных не могут возникнуть. Они не имеют отношения к опросу.

Таблица содержит строки, которые делают некоторый предикат (шаблон оператора, параметризованный именами столбцов), true. Объединение таблиц содержит строки, которые предикаты AND предикатов таблиц истинны. A WHERE условие ограничение таблицы содержит строки, которые делают предикат таблицы ANDed с условием true. Чтобы запросить, найдите предикат, для которого вы хотите удовлетворительные строки, и напишите соответствующее реляционное выражение.

Я подозреваю, что «добавление слишком большого количества внешних ключей в микс» - это ваша попытка сказать «выбор предикатов, параметризованных столбцами, которые не принадлежат». Например, в вашем дизайне в соответствии с вашими декларациями о столбцах и кандидатах, инструктор преподает ровно один курс. Если это не то, что вы хотите, ваши объявления столбцов и/или кандидатов не отражают ваши предикаты и/или ваши предикаты не могут выразить ситуации, которые могут возникнуть. Например, для обучения ноль или более курсов: заявленный ключевой ключ кандидата не может быть правильным для данных столбцов, и если вы хотите, чтобы StaffID был ключом кандидата (который является лучшим дизайном), тогда CourseTaught следует удалить из таблицы сотрудников, и вы должны иметь другую таблицу с StaffID & CourseTaught. Схема схемы предполагает поиск достаточных избыточных предикатов/таблиц для описания любой ситуации. (Мы тогда нормализуем, чтобы упростить дизайн.)

Смежные вопросы