【问题标题】:Can there be two relationships between two tables?两个表之间可以有两种关系吗?
【发布时间】:2011-06-10 06:37:26
【问题描述】:

有两个表:EMPLOYER 和 EMPLOYEE。由于每个 EMPLOYEE 都分配给一个 EMPLOYER,因此它们之间存在 1:N 的关系——简单的东西。 但我也希望能够模拟这样一种情况,即每个 EMPLOYER 都可以选择他一个最喜欢的 EMPLOYEE(他也可以不选)。

我也应该:
1. 在这些表之间添加第二个 1:1 关系 - 这样 EMPLOYER 也将包含 EMPLOYEE_id_FK。 是否允许在两个表之间建立两个关系?
2. 添加第三个表 FAV,由两个唯一的主键 - EMPLOYER_ID 和 EMPLOYEE_ID 标识?这样我就可以确保每个雇主只能有一个最喜欢的员工,而且每个员工只能被一个员工选为最喜欢的员工——这正是我想要的。

正确的做法是什么?

【问题讨论】:

    标签: mysql database-design


    【解决方案1】:

    我的建议是有四张桌子。一张雇员表,一张雇主表,一张将雇员与雇主联系起来的表格(谁说一个雇员不能为两个雇主工作),最后一张表格将一位雇主与他们最喜欢的雇员联系起来。

    编辑:是的,当然,相同的两个表之间可以有两种关系。

    【讨论】:

    • “相同的两个表之间可以有两个关系”——但这需要可延迟的外键约束,这在 MySQL 中不可用。
    • 不一定,您可以使用“加入表格”来完成,基本上正如我在回答中所建议的那样。这不需要什么花哨的东西。
    • 嗯,是的,使用第三张桌子。但不是只有两张桌子。 ;-)
    • 哈哈,是的,不只是两张桌子。
    • @Nik - 你能描述一下存储最喜欢的员工信息的表吗?就我而言,雇主只能拥有一名最喜欢的员工,而一名雇员只能受到一名雇主的青睐(是的,我知道这听起来很愚蠢,但这并不是关于雇员和雇主的……)-那么我想它应该看起来像这样: FAV (id_employer, id_employee, PRIMARY(id_employer, id_employee), UNIQUE(id_employer), UNIQUE(id_employee)。有意义吗?
    【解决方案2】:

    您需要添加一个额外的表(即四个表而不是三个)或在雇主 2 雇员表中添加某种 is_preferred 标志)。

    【讨论】:

      【解决方案3】:

      是的,这是允许的。您可以拥有任意数量的 FK。

      顺便说一句:这是 1:N 的关系,而不是 1:1。当我对此建模时,两者都是 N:M 关系,因为一名员工可以拥有多个雇主。

      【讨论】:

        【解决方案4】:

        @Nik 是对的,你可以让一个员工有两个雇主,但是,我猜一个员工只能有一个最喜欢的,所以你只需要 FK 关系,其中 Employer 是 Employee 中的 FavoriteEmp 字段的主要字段。

        【讨论】:

        • 确实如此,但这不是一个好的设计。你必须牢记未来。也许雇主将来会想要两个最喜欢的员工,或者最喜欢的员工会演变成非常优秀的员工。
        • @Nik,我不同意这一点,但同时你不能在任何情况下都是童子军,并为一切做好准备。您有需求,您可以创建最佳和最有效的设计,同时利用两者来展示满足 FRS 的产品。
        • 当然可以,但这几乎不是什么额外的东西。
        • 好的,为了简单起见,我假设一个员工只能有一个雇主。但是我的问题仍然存在,选择最喜欢的可以只用两张桌子完成吗?这是正确的:EMPLOYER ( id (PK), id_fav_employee(FK) ) EMPLOYEE( id (PK) id_employee (FK) )
        • @Matt,不,您希望每个员工都有一个最喜欢的雇主。这为您提供了最少字段为 Id、EmployerId、Name、FavoriteEmployerId 的 Employee。具有最少字段的 Employer 表是 Id、Name。 FavoriteEmployerId 和 EmployerId 将是与 Employer 表的 FK 关系。
        猜你喜欢
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        相关资源
        最近更新 更多