【问题标题】:How do I join multiple tables in SQL whose objects will be modeled using inheritance?如何在 SQL 中连接多个表,其对象将使用继承建模?
【发布时间】:2010-09-30 17:11:55
【问题描述】:

为了我的大学作业,我必须设计一些基本的疾病管理系统,以及所有的学校。我决定以

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

人员(PersonID、FirstName、LastName)

Student(StudentID(引用 PersonID),...)

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

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

例如

Student.FirstName Student.LastName、Staff.FirstName、Staff.LastName 等...

我该怎么做?

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

提前致谢。

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

【问题讨论】:

  • 等一下,Staff Person 继承自 Student Person?这似乎不对。
  • 啊——新行没有出现——它们都应该从 Person 继承

标签: mysql database inheritance modeling


【解决方案1】:

这是不对的。您应该有一个 Person 类,而其他类将确定某个 Person 是 Student、Staff 等。如果您有一个 Staff 也是学生,会发生什么?如果学生毕业会怎样?

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

例如,您可以有三个表:


个人身份 姓 名字

学生 学生卡 个人身份

员工
员工编号 个人身份

【讨论】:

  • 对不起 - 我格式错误,提交时没有注意到。
  • 当我对这类数据建模时,你建议我做什么?
  • 那么在 Inherited 类中没有 PersonID 的建模是个坏主意吗?
  • 并不是说这不是一个好主意——它是行不通的。至少根据我的经验,当涉及到关系模型时,最好在您的对象模型中接受它。
【解决方案2】:

我不知道真正的用法是什么,但是仅仅为了可重用性而使用继承并不是一个好主意。

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

你最好提一下任务的目标/目的——应该做什么。

【讨论】:

    【解决方案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)
    );
    

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

    【讨论】:

    • 谢谢 - 您的反馈解决了我的问题 - 我从未使用过 USING 来创建 JOIN。
    • 是的,USING 只是一种快捷方式,用于对两个表中具有相同名称的列进行相等比较。如果列名称不同,则需要在 ON 子句中编写显式表达式。
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多