如何在SQL中连接多个表,其对象将使用继承建模?

时间:2009-01-10 21:44:02

标签: mysql database inheritance modeling

对于我的大学任务,我必须为疾病和学校设计一些基本的管理系统。我决定以

的形式建模一些基本的继承
  • 人 - >学生
  • 人 - >人员
  • 人 - >监护人

Person(PersonID,FirstName,LastName)

学生(StudentID(引用PersonID),...)

我决定这样做的原因是我在UML中首先对此进行了建模,并在此中进行了继承。

我有另一个表存储了具有StudentID,StaffID和GuardianID的事件的表。但是我想知道如何在mysql中创建一个连接来显示所有三个继承人的姓名?

e.g。

Student.FirstName Student.LastName,Staff.FirstName,Staff.LastName等...

我该怎么做?

或者我这样做完全错了吗?

提前致谢。

http://pastebin.com/m263dd7 - 链接到我的DDL表格。

3 个答案:

答案 0 :(得分:3)

我对您描述的数据库设计没有任何问题。在SQL中建模继承总是有点尴尬,但你使用了问题最少的解决方案。

这是一个回答您关于检索特定事件的学生和工作人员姓名的问题的查询:

SELECT ps.FirstName, ps.LastName, pf.FirstName, pf.LastName
FROM Incidents i
 JOIN Students s USING (student_id)
 JOIN Persons ps ON (s.student_id = ps.person_id)
 JOIN Staff f USING (staff_id)
 JOIN Persons pf ON (f.staff_id = pf.person_id)
WHERE i.incident_id = ?;

我假设Incidents表看起来包括如下列:

CREATE TABLE Incidents (
  incident_id SERIAL PRIMARY KEY,
  student_id  INT NOT NULL,
  staff_id    INT NOT NULL,
  FOREIGN KEY (student_id) REFERENCES Students(student_id),
  FOREIGN KEY (staff_id) REFERENCES Staff(staff_id)
);

实际上,我希望事件与每个员工和学生之间存在多种多对多的关系。否则,事件只涉及一名学生和一名工作人员?

答案 1 :(得分:1)

这是不对的。您应该有一个Person类,其他类将确定某个人是学生,员工等。如果您的员工也是学生,会发生什么?学生毕业后会发生什么?

这是关系模型和OO模型之间阻抗不匹配的典型例子。

你可以有三个表:

PERSON
PERSONID 姓 姓

STUDENT 学生卡 PERSONID

职工
,STAFFID PERSONID

答案 2 :(得分:0)

我不知道实际用途是什么,但仅仅为了可重用性而使用继承并不是一个好主意。

乍一看,在大学管理系统(类似的)中有一个Person课程似乎不对。

你最好提及作业的目的/目的 - 应该做什么。