I have an old database design that I think I can streamline and make more normalized. I was hoping to get some thoughts on this. Here are the “rules” for the database:
The organization is made up three hierarchies:
a. Bureau - is the highest level
b. Office - each bureau can have many offices
c. Division - each office can have many divisionsWe have employees that work at all of the three tiers. For example:
a. We have Bureau level staff. They do not belong to an office or division. The oversee all offices, but do not belong to them
b. We have Office level employees, that do not belong to a specific division, but oversees all divisions
c. Division level folks that belong to a divisionWe also have projects. A project can be at various levels:
a. Bureau wide projects
b. Projects that span multiple offices
c. Projects just in a divisionEvery project needs to be managed by at least one employee, having a specific role (project manager) tough the employees table would be made of individuals with other roles, and even multiple roles.
Currently, I have the following schema (it’s abridged for brevity):
With this schema, I have found the following issues:
All projects are tied to a division, in this model. But, in reality, not all projects are directly attributable to a division. Some maybe at the office or bureau level. Others may be across multiple offices or bureaus (but not across multiple bureaus AND offices). So, I get around this by having extra options in each of the organization Tiers. For example. In the Division Table, I have an option for Office Wide or Bureau Wide. Or I might have an options like Office One/Office Two.
Another issue I see: each of the roles tables have many duplicate values. For example, if we look at divisionRole table. Almost all divisions have the same role. So, I have DivisionManager, divisonPM, divisionLead listed multiple times (once for each division). Sometimes, a division may have a unique position, but this is rare. This is true for the BureauRole and OfficeRole tables
So, I am looking for advice on how to better normalize this database, and address the above scenarios. Anyone have suggestions?