【问题标题】:Translating relationship attributes from ER diagram into SQL将 ER 图中的关系属性转换为 SQL
【发布时间】:2013-12-29 21:21:22
【问题描述】:

目前正在尝试第一次掌握 SQL,因此我正在解决一些问题。这是一个示例数据库规范:

学生(姓名、性别、课程)做项目(标题)。每个项目都有 两名主管(姓名、性别、部门)。所有学生都做一个项目 但并非所有项目都被接受。不止一名学生可以做同样的事情 项目。学生定期与他们的一位主管会面,这些 会议记录(日期、时间、学生、主管、笔记)。

到目前为止,我已经绘制了一个我认为正确的 ER 图:

我可以获得基础知识(例如创建学生表等),但我无法弄清楚如何表示关系,特别是会议关系,以及如何在 SQL 中表示它及其属性。我应该创建一个“会议”实体吗?

【问题讨论】:

    标签: mysql sql entity-relationship diagram


    【解决方案1】:

    是的,您应该创建一个Meeting 实体来表示StudentSupervisor 之间的多对多关系。在其中,您可以使用与这些相应表相对应的外键来关联这些表。在 SQL 中,它可能看起来像这样:

    Create table Meeting {
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    student_id INT NOT NULL,
    supervisor_id INT NOT NULL,
    //rest of the fields...   
    FOREIGN KEY (student_id) REFERENCES Student(id)
    FOREIGN KEY (supervisor_id) REFERENCES Supervisor(id)
    }
    

    您也可以对ProjectSupervisor 之间的Supervise 执行相同的操作。您也可以在会议表上使用称为复合键的东西,我想这取决于个人喜好,我通常在表示多对多关系时这样做。我并不是说这是您将使用的语法,这取决于您的数据库,这只是为您指明正确方向的一个示例。希望对您有所帮助。

    对于您的图表(我只是猜测这是针对一个类),您可能需要研究诸如 visio 或视觉范式之类的软件来创建您的 ER 图表。虽然大多数人都能理解您当前的图表,但这不是正确的建模。

    为了好玩,我根据您的表格制作了一个图表:

    如果SupervisorProject 是多对多关系,您可能需要一个实体。这称为associative entity。我标记了我的 SupervisorProject 只是为了让它们更清楚一点。

    编辑 忽略了学生和项目是多对一的事实,解决了这个问题,抱歉。

    【讨论】:

    • 对于可以处理 ERD 的 Mac 或 iOS 通用绘图应用程序,请查看OmniGraffle
    • 太棒了 - 您能否进一步说明将 Supervise 设为实体的优点?
    【解决方案2】:

    在回应 Cohagen 时,this stackoverflow post 建议像 Supervise 这样的多对多关系可以通过保留关系表来表示,即使它没有属性。相比之下,Do 表位于多对一关系之间并且没有属性,因此我们可以摆脱它,只需在学生项目表中添加外键引用即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2013-04-29
      相关资源
      最近更新 更多