How to represent a categorized many-to-many database relationship where categories are specific to one side of the relationship

*爱你&永不变心* 提交于 2020-01-14 14:03:13

问题


I'm working on building a database to manage project assignments, and the one part that's giving me particular trouble is the assignment of job titles to employees with for each project they are working on.

Requirements

  1. An Employee can be on multiple Projects at a time
  2. A Project has multiple Employees on it
  3. A Project has multiple Job Titles
  4. An Employee works on a Project under exactly one of the Project's Job Titles
  5. Multiple Employees can work under the same Job Title in a Project

I'm not sure how to represent this using tables; every layout I come up with either makes it possible for an employee to work on a project under a job title from a different project, or they are able to work on the same project under two different job titles.

Example Diagrams

Basically, I have three tables:

Tables

  • Projects
    • Project Name (unique)
    • Project ID
  • Employees
    • Employee Name (unique)
    • Employee ID
  • Job Titles
    • Title
    • Project ID (Title-ProjectID unique)
    • Title ID

And then a cross-reference table, called Assignments. The two ways I have come up with so far for Assignments are as follows:

Example 1

  • Assignments
    • Employee ID
    • Project ID (EmployeeID-ProjectID unique)
    • Title ID (unique)
    • AssignmentID

This way limits employees to one title per project, but allows them to use a title that doesn't belong to the project in the assignment.

Example 2

  • Assignments
    • Employee ID
    • Title ID (EmployeeID-TitleID unique)
    • AssignmentID

This way assigns employees to the project through the title, so it is impossible to assign someone to a project with an invalid title. However, this allows an employee to be assigned to the same project under multiple titles.

Again, the diagrams are available here: http://i.imgur.com/IbR0P.png

I know there must be a way to do this cleanly, but I haven't had any real formal training in database design and I can't find anything through my searches except how to make a many-to-many relationship, which isn't exactly what I need help with.

Thanks!

  • EDIT 1
    • Bolded Primary Key Fields (were underlined in diagram image, but hard to tell since they are the last fields)
    • Added AssignmentID (Primary Key) to Assignments table in the question (was present in designs, forgot to include when creating question & diagram)
  • EDIT 2
    • Added missing requirement (5)
    • Added headers for examples and requirements
  • EDIT 3
    • I have 10 rep now, so I can put up the diagram!
  • EDIT 4
    • Added identifiers for unique keys (individual unique keys identified in diagram, but I don't know how to do compound keys in DIA)

回答1:


Add an ID field to you Job Titles table - let's call it JobTitleID

Now your Assignments table has Employee ID and JobTitleID.

This ofcourse means, that to find the Projects for an employee, you need to join through the Assignments table and the Job Titles table

EDIT

After discussion in the comments, please disregard the above, I left it only as history.

Now here is the new version: Your Assignments table needs (as you already considered)

  • Employee ID
  • Project ID
  • Title ID
  • AssignmentID

But it also needs a UNIQUE INDEX(EmployeeID, ProjectID) - this will make it impossible for one employee to be in the same project under different titles.

Multiple employees under the same title will still be allowed, as well as multiple titles in different projects for one employee.




回答2:


Do it the first way you mention. It doesn't limit a person to one job title, you can create another record with the same Employee ID and Project ID but with a different Title ID, just use a new Assignment ID as the primary key.

You might even want to take Project ID out of the Job Title table.



来源:https://stackoverflow.com/questions/11228453/how-to-represent-a-categorized-many-to-many-database-relationship-where-categori

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!