2012-01-09 2 views
2

У меня есть таблица:внешнего ключа в SQL

PROFESSOR(pid, pname) 

и другую таблицу:

EXAM(examid, professorID, assistantID , examinerID, subject); 

Я хочу сослаться на professorID,assistantID and examinerIDpid. Профессор может быть помощником на экзамене и быть экзаменатором, а также предмет принадлежит профессору, поэтому профессора, ассистенты и экзаменаторы в таблице EXAM выбираются из профессоров в таблице PROFESSOR.

Я думаю, что схема, которую я разработал, ошибочна, не так ли? Если не так, как это изменить, чтобы я мог выполнить условие, которое я объяснил выше.

Вы можете помочь с этим!

+1

Трудно сказать, что здесь задают. Не могли бы вы уточнить? –

+1

Почему вы публикуете псевдокод - когда вы можете вставлять фактические операторы создания mysql?Что вы имеете в виду под «Я хочу, чтобы refrency ProfessorID, assistantID и examinerID to pid» –

+0

@AdrianCornish Я думаю, что он пытается сказать, что pid вставлен на эти столбцы, чтобы профессор мог стать профессором (ProfessorID), помощником (assitantID) или экзаменатор (examinerID), вот как я его получаю. –

ответ

0

Ваша схема неправильная.

Вы должны определить три таблицы. Профессор, экзамен и предмет.

Для помощника и экзаменатора вы должны определить столбец в роли «роли» профессора. Столбец роли будет определять, является ли профессор профессором, экзаменатором или помощником. Внешний стол таблицы профессора будет использоваться в обеих таблицах. т.е. предмет и экзамен.

Я думаю, это поможет вам много сделать ваши столы.

+0

Я соглашаюсь создать отдельную таблицу для темы и использовать pid для двух других столбцов, но я не думаю, что ему все еще нужно добавить новую роль столбца, потому что столбца таблицы экзаменов уже достаточно, и все они профессора поэтому только на экзаменах они становятся экзаменатором или ассистентом, не уверенным, почему вы действительно хотите добавить столбец роли на столе профессора, но также хотели бы услышать вашу сторону об этом. :) –

1

Я думаю, что схема может быть переработана. Вы можете иметь три таблицы: -

Профессор (pid, pname, pAddr);

Экзамен (экзамен, subjectId, ..., .., assistantId, ExaminerId); (assistantId и ExaminerId, ссылающиеся на pId)

Тема (с сообщением, по убыванию, курс, профессор); (ProfessorId refering pId)

0

Я думаю, что схемы достаточно уже основаны на отношениях, которые ему нужны («Профессор может быть помощником на экзамене и быть экзаменатором»). Затем он мог напрямую использовать pid для столбцов profIDID, assistanID и examinerID, но, тем не менее, предмет должен быть отдельной таблицей к тому времени, но каким-то образом не был уверен в других деталях, которые вам нужны для таблицы профессора, было бы больше информации о фактическая реализация для этого, но в любом случае важно то, что только несколько tweek, и у вас будут хорошие отношения на ходу. :)

0

вы можете:

SELECT 
     `exam`.`examID` 
    , COALESCE(`professor`.`pName`,'') AS ProfessorName 
    , COALESCE(`professor_2`.`pName`,'') AS AssistantName 
    , COALESCE(`professor_1`.`pName`, '') AS ExaminerName 
    , `exam`.`iSubject` 
FROM 
    `sampledb`.`exam` 
    LEFT JOIN `sampledb`.`professor` 
     ON (`exam`.`professorID` = `professor`.`pID`) 
    LEFT JOIN `sampledb`.`professor` AS `professor_1` 
     ON (`exam`.`assistantID` = `professor_1`.`pID`) 
    LEFT JOIN `sampledb`.`professor` AS `professor_2` 
     ON (`exam`.`examinerID` = `professor_2`.`pID`); 
0

Спасибо всем, я хотел assistantID, professorID и examinerID к refrence PID. Я использовал Navicat для визуального проектирования таблиц, и он работал неправильно. Я тестировал одно и то же в sqlserver и mysql (используя workbench) и бинго.

 
CREATE TABLE `exam` (
    `examID` int(11) NOT NULL, 
    `pID` int(11) DEFAULT NULL, 
    `assistantID` int(11) DEFAULT NULL, 
    `examinerID` int(11) DEFAULT NULL, 
    PRIMARY KEY (`examID`), 
    KEY `professor` (`pID`), 
    KEY `assistant` (`assistantID`), 
    KEY `examiner` (`examinerID`), 
    CONSTRAINT `assistant` FOREIGN KEY (`assistantID`) REFERENCES `professor` (`pid`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `examiner` FOREIGN KEY (`examinerID`) REFERENCES `professor` (`pid`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `professor` FOREIGN KEY (`pID`) REFERENCES `professor` (`pid`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

на данный момент я просто пропустил тему, потому что ей нужен лучший дизайн схемы.

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