В базе данных mysql у меня есть в общей сложности 7 таблиц. В нормальных условиях инструктор принадлежит только одной академии, но в академии может быть много инструкторов. Точно так же многие курсы можно преподавать в одной академии. Я не помню, какой преподаватель преподавал, какой курс, но какой курс преподается в x или y академии. Кроме того, каждая академия имеет основного контактного лица и в отличие от инструкторов, контактное лицо может быть частью нескольких академий. В конце концов, я хотел бы запустить запрос, где я могу видеть связанные данные в определенной академии по своему выбору.Структура таблицы и внешние ключи
Являются ли приведенные ниже таблицы структурированными, чтобы хранить/отображать данные вдали от того, что нет повторных значений тех же инструкторов, курсов и т. Д.?
CREATE TABLE IF NOT EXISTS `academies` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(25) NOT NULL,
`mou_id` int(11) default NULL,
`academy_id` int(11) NOT NULL,
`street_address` varchar(50) NOT NULL,
`city` varchar(25) NOT NULL,
`state` varchar(25) NOT NULL,
`country` varchar(25) NOT NULL,
`zipcode` varchar(5) NOT NULL,
`telephone` varchar(15) NOT NULL,
`comments` text,
`last_contacted` date default NULL,
PRIMARY KEY (`id`)
) ;
CREATE TABLE IF NOT EXISTS `academy_courses` (
`id` int(11) NOT NULL auto_increment,
`academy_id` int(11) NOT NULL,
`course_name` varchar(75) NOT NULL,
`course_id` int(11) NOT NULL,
`instructor_id` int(11) NOT NULL,
`start_date` date default NULL,
PRIMARY KEY (`unique_id`),
KEY `course_id` (`academy_id`,`course_id`)
);
CREATE TABLE IF NOT EXISTS `courses` (
`course_id` int(11) NOT NULL auto_increment,
`course_name` varchar(75) NOT NULL,
PRIMARY KEY (`course_id`)
);
INSERT INTO `courses` (`course_id`, `course_name`) VALUES
(1, 'Math'),
(2, 'English'),
(3, 'Science'),
(4, 'HIstory');
CREATE TABLE IF NOT EXISTS `instructors` (
`instructor_id` int(11) NOT NULL auto_increment,
`academy_id` int(11) NOT NULL,
`instructor_name` varchar(50) NOT NULL,
`instructor_phone` varchar(15) default NULL,
`instructor_email` varchar(55) default NULL,
PRIMARY KEY (`instructor_id`),
KEY `academy_id` (`academy_id`)
);
CREATE TABLE IF NOT EXISTS `last_contacted` (
`talkedto_id` int(11) NOT NULL auto_increment,
`academy_id` int(11) NOT NULL,
`talkedto_name` varchar(50) NOT NULL,
PRIMARY KEY (`talkedto_id`),
KEY `academy_id` (`academy_id`)
);
CREATE TABLE IF NOT EXISTS `main_contact` (
`contact_id` int(11) NOT NULL auto_increment,
`academy_id` int(11) NOT NULL,
`contact_name` varchar(50) NOT NULL,
`contact_phone` varchar(15) default NULL,
`contact_email` varchar(55) default NULL,
PRIMARY KEY (`contact_id`),
KEY `academy_id` (`academy_id`)
);
CREATE TABLE IF NOT EXISTS `main_contact_bridge` (
`academy_id` int(11) NOT NULL,
`contact_id` int(11) NOT NULL,
PRIMARY KEY (`contact_id`,`academy_id`),
KEY `academy_id` (`academy_id`)
);
UPDATE: на основе Ответ на Emmad Карима
CREATE TABLE IF NOT EXISTS `person` (
id int(11) NOT NULL auto_increment,
`academy_id` int(11) NOT NULL,
`person_name` varchar(50) NOT NULL,
`person_email` varchar(50) default NULL,
`person_phone` varchar(15) default NULL,
PRIMARY KEY (`id`),
CONSTRAINT `academy_id` FOREIGN KEY (`academy_id`) REFERENCES `academy` (`academy_id`) ON DELETE CASCADE ON UPDATE CASCADE,
);
Хорошо сделал большинство изменений. Один вопрос вы можете написать запрос для таблицы 'person', где я могу определить, имеет ли человек роль инструктора или контакт или и то, и другое? Я не уверен, что мне нужно добавить внешний ключ. –
Если вы создаете таблицу для Person, вам нужно создать таблицу моста (скажем, PersonRole). Эта таблица будет иметь флаг, указывающий, является ли роль для контакта или нет (в реальной жизни вы бы создали поиск роли). Запрос будет SELECT * FROM Person, Role, Academy Where PersonID = ... AND AcademyID = ... – NoChance
Хорошо, что это имеет смысл. Что бы тогда была таблица «Личность»? –