我有一张桌子:
PROFESSOR(pid, pname)
和另一张表:
EXAM(examid, professorID, assistantID , examinerID, subject);
我想将professorID,assistantID and examinerID
引用到pid
。教授可以是考试助理,也可以是考官,主题也属于教授,EXAM
表中的教授,助理和考官都是从PROFESSOR
表中的教授中选出的。
我认为我设计的架构是错的,是吗?如果它的错误如何改变它,以便我能满足上面解释的条件。
你能帮帮忙吗?
答案 0 :(得分:1)
我认为架构可以重新设计。您可以有三个表: -
教授(pid,pname,pAddr);
考试(examId,subjectId,...,..,assistantId,ExaminerId); (assistantId和ExaminerId引用pId)
主题(subjectId,desc,course,professorId); (教授参考pId)
答案 1 :(得分:0)
您的架构错误。
您应该定义三个表。教授,考试和科目。
对于助理和考官,您应该在教授表'角色'中定义一列。角色列将定义教授是教授,考官还是助理。教授表外键将进入其他两个表。主题和考试。
我认为它可以帮助你制作表格。
答案 2 :(得分:0)
我认为模式已经足够基于他所需要的关系(“教授可以成为考试助理并成为考官”)。然后他可以直接在列的教授ID,assistanID和examinerID上使用pid,但是然后主题应该是一个单独的表,但是不知道怎么不确定教授表需要的其他细节那里会有更多细节。实际的实现,但无论如何重要的是只有几个tweek,你会在旅途中有一个良好的关系。 :)
答案 3 :(得分: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`);
答案 4 :(得分:0)
谢谢大家,我希望使用assistantID,professorID和examinerID来引用PID。我正在使用Navicat在视觉上设计表格,但它无法正常工作。我在sqlserver和mysql中测试了同样的东西(使用workbench)和bingo它的工作原理。
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;
现在我只是省略了主题,因为它需要更好的架构设计。