问题
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
- An Employee can be on multiple Projects at a time
- A Project has multiple Employees on it
- A Project has multiple Job Titles
- An Employee works on a Project under exactly one of the Project's Job Titles
- 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