如何表示分类的多对多数据库关系,其中类别特定于关系的一侧

时间:2012-06-27 14:25:37

标签: mysql database many-to-many relationship

我正在建立一个数据库来管理项目任务,而那个让我特别麻烦的部分就是为员工分配他们正在处理的每个项目的职位。

要求

  1. 员工可以一次访问多个项目
  2. 项目上有多名员工
  3. 项目有多个职位名称
  4. 员工只在项目的职位名称之一的项目上工作
  5. 多名员工可以在项目中的相同职位下工作
  6. 我不确定如何使用表来表示这个;我想出的每一个布局都可以使一个员工在一个不同项目的职位下工作,或者他们能够在两个不同的职位下工作同一个项目。

    示例图

    Image link at end of question

    基本上,我有三张桌子:

    • 项目
      • 项目名称(唯一)
      • 项目ID
    • 员工
      • 员工姓名(唯一)
      • 员工ID
    • 职位名称
      • 标题
      • 项目ID(Title-ProjectID唯一)
      • 标题ID

    然后是一个名为Assignments的交叉引用表。到目前为止我为分配提出的两种方式如下:

    示例1

    • 分配
      • 员工ID
      • 项目ID(EmployeeID-ProjectID唯一)
      • 标题ID(唯一)
      • AssignmentID

    这种方式将员工限制为每个项目一个标题,但允许他们在作业中使用不属于项目的标题。

    示例2

    • 分配
      • 员工ID
      • 标题ID(EmployeeID-TitleID unique)
      • AssignmentID

    这种方式通过标题将员工分配到项目中,因此无法将某人分配给具有无效标题的项目。但是,这允许将员工分配到多个标题下的同一项目。

    同样,图表可在此处获取:http://i.imgur.com/IbR0P.png

    我知道必须有一种方法可以干净利落地完成这项工作,但我没有在数据库设计方面进行任何真正的正式培训,除了如何建立多对多关系外,我无法通过我的搜索找到任何内容,这不完全是我需要帮助的。

    谢谢!

    • 编辑1
      • 粗体主键字段(在图表图像中加下划线,但很难说是因为它们是最后的字段)
      • 在问题中的“分配”表中添加了AssignmentID(主键)(在设计中存在,在创建问题和图表时忘记包含)
    • 编辑2
      • 添加了缺失的要求(5)
      • 为示例和要求添加了标题
    • 编辑3
      • 我现在有10个代表,所以我可以提出图表!
    • 编辑4
      • 添加了唯一键的标识符(图中标识的各个唯一键,但我不知道如何在DIA中执行复合键)

2 个答案:

答案 0 :(得分:2)

为您Job Titles表添加ID字段 - 让我们称之为JobTitleID

现在,您的Assignments表格有Employee IDJobTitleID

这意味着,为了找到员工的项目,您需要加入Assignments Job Titles

修改

在评论中讨论后,请忽略上述内容,我只将其作为历史记录。

现在这里是新版本:您的Assignments表需要(正如您已经考虑过的)

  • 员工ID
  • 项目ID
  • 标题ID
  • AssignmentID

但它还需要UNIQUE INDEX(EmployeeID, ProjectID) - 这将使一名员工无法进入不同职位的相同项目。

仍然允许同一职位下的多名员工,以及一名员工的不同项目中的多个职位。

答案 1 :(得分:0)

这是你提到的第一种方式。它不会将一个人限制为一个职位,您可以使用相同的员工ID和项目ID创建另一个具有不同标题ID的记录,只需使用新的分配ID作为主键。

您甚至可能希望从Job Title表中取出Project ID。