I inherited a database in my workplace a number of years ago. Initially the entire database consisted solely of a single table with all the associated data and a second table that was (and still is) as far as I can see essentially a copy of all the data in the first table. I still don't understand why the original designer did it that way.
There is a single form for the database, which linked to the first of the two tables. Clicking the Save Data button copied all that data into the second table. A few years ago, I was forced to do some rudimentary normalization - pulling a few fields out of the table and into some secondary tables - because the number of data points I needed to track had increased somewhat, and the table was already so large that adding more exceeded the maximum number of fields that Access could handle.
For a long time I resisted normalizing this thing because of the sheer amount of work involved: especially having to reconnect everything, fixing all the reports, etc. But... this thing is a beast, and it needs to be done right, for the future.
Here's the problem. This isn't a standard normalization problem, where you've got fields with tons of repeated data. Let me see if I can explain somewhat generically. My department does a lot of pro-forma finance analysis for the purchase of some large and expensive Widgets. The Widgets are very expensive, but are also an important revenue driver for our company: i.e. the widgets are a key raw material in our products. The Widgets can be used in a few different ways: we can burn a lot of the Widget's value in a heavy run of our product that we call a "Burst" that produces a lot of a specific product all at once, or we can use it in a rotational "Schedule" that uses the Widget up at a more steady rate over time.
My database tracks how we thought we would use the Widget at the time that we acquired it versus how we actually used the Widget. So there's how many "Bursts" of the Widget, and all of the associated details related to the burst, and how much "Schedule" use of the Widget we anticipated, etc. And then how many "Bursts" we actually had, and all associated details, and how much "Schedule" use, etc. So... each anticipated "Burst" at the the time of our acquisition Analysis and each of the detailed datapoints has a field. Each actual "Burst" and data points likewise. So... There's fields like "AcqBurst1Plant", "Acq1BurstDate", "AcqBurst1Cycles", "AcqBurst1Prod", "AcqBurst1Revenue", "AcqBurst1Cost" (for the amortized cost associated with that burst), etc. Then "AcqBurst2Plant", "Acq2BurstDate", "AcqBurst2Cycles", and so on. Then "ActBurst1Plant", "ActBurst1Date", "ActBurst1Cycles", and so on and on, for the Acquisition Estimate and the Actual, respectively. You see how this is an awful format?
I have groups of fields going out for up to 6 "Bursts" of the widget in production. Most times when we get a Widget into production, it's either strictly for Scheduled use, or there's only one or maybe two "Bursts". Occassionally we have a Widget that gets used up in 4, 5, or even 6 "Bursts". If we ever have a Widget that was going for a 7th or 8th... our database couldn't handle it. Consequently most of those Burst fields are empty, and for a small handful they're all used up.
It seems evident to me that there should be a separate "Bursts" table that refers back to the WidgetID key field in a main table. The Burst table probably should have a field for an "Acq" burst versus an "Actual" burst, to differentiate between our acquisition estimated Bursts vs. Actual bursts, then fields for Date, Plant, Cycles, etc.
This doesn't seem to be something the Analyze Table tool knows how to handle. I'm hoping there's an automated way to pull this data into a better format. But I'm afraid I'm going to have to brute-force manually copy this data for each widget into a proper Burst table...
Does anybody have any thoughts on a better approach?
There is a single form for the database, which linked to the first of the two tables. Clicking the Save Data button copied all that data into the second table. A few years ago, I was forced to do some rudimentary normalization - pulling a few fields out of the table and into some secondary tables - because the number of data points I needed to track had increased somewhat, and the table was already so large that adding more exceeded the maximum number of fields that Access could handle.
For a long time I resisted normalizing this thing because of the sheer amount of work involved: especially having to reconnect everything, fixing all the reports, etc. But... this thing is a beast, and it needs to be done right, for the future.
Here's the problem. This isn't a standard normalization problem, where you've got fields with tons of repeated data. Let me see if I can explain somewhat generically. My department does a lot of pro-forma finance analysis for the purchase of some large and expensive Widgets. The Widgets are very expensive, but are also an important revenue driver for our company: i.e. the widgets are a key raw material in our products. The Widgets can be used in a few different ways: we can burn a lot of the Widget's value in a heavy run of our product that we call a "Burst" that produces a lot of a specific product all at once, or we can use it in a rotational "Schedule" that uses the Widget up at a more steady rate over time.
My database tracks how we thought we would use the Widget at the time that we acquired it versus how we actually used the Widget. So there's how many "Bursts" of the Widget, and all of the associated details related to the burst, and how much "Schedule" use of the Widget we anticipated, etc. And then how many "Bursts" we actually had, and all associated details, and how much "Schedule" use, etc. So... each anticipated "Burst" at the the time of our acquisition Analysis and each of the detailed datapoints has a field. Each actual "Burst" and data points likewise. So... There's fields like "AcqBurst1Plant", "Acq1BurstDate", "AcqBurst1Cycles", "AcqBurst1Prod", "AcqBurst1Revenue", "AcqBurst1Cost" (for the amortized cost associated with that burst), etc. Then "AcqBurst2Plant", "Acq2BurstDate", "AcqBurst2Cycles", and so on. Then "ActBurst1Plant", "ActBurst1Date", "ActBurst1Cycles", and so on and on, for the Acquisition Estimate and the Actual, respectively. You see how this is an awful format?
I have groups of fields going out for up to 6 "Bursts" of the widget in production. Most times when we get a Widget into production, it's either strictly for Scheduled use, or there's only one or maybe two "Bursts". Occassionally we have a Widget that gets used up in 4, 5, or even 6 "Bursts". If we ever have a Widget that was going for a 7th or 8th... our database couldn't handle it. Consequently most of those Burst fields are empty, and for a small handful they're all used up.
It seems evident to me that there should be a separate "Bursts" table that refers back to the WidgetID key field in a main table. The Burst table probably should have a field for an "Acq" burst versus an "Actual" burst, to differentiate between our acquisition estimated Bursts vs. Actual bursts, then fields for Date, Plant, Cycles, etc.
This doesn't seem to be something the Analyze Table tool knows how to handle. I'm hoping there's an automated way to pull this data into a better format. But I'm afraid I'm going to have to brute-force manually copy this data for each widget into a proper Burst table...
Does anybody have any thoughts on a better approach?