About 20 years ago, I learned that the best way to deal with this kind of information is by just doing inserts into a database. You should not modify existing records and definitely not delete any records. Basically, what you would be storing is not the data itself but the modifications on the data. As a result, you would just end up with a single table that could do everything you want, if only you had enough CPU/Disk speed to walk through all data to calculate the data based on just these inserts.
Storing just modifications will allow you to keep a complete history of all your data, allowing you to be extremely flexible. Basically, you'd only need one table which contains everything. The drawback is that you need to do a lot more calculations and need a lot more disk reads so you need tricks to speed the process up. Flexibility at the cost of performance...
In this case, you would end up with a similar problem. A single table would be accessed by anything that would need to add or update records. It would be your bottleneck. It's still great in a single-user environment, since only one user would be using it. In a low-user environment, it could still have a very good performance. But if you have 250+ users accessing this table all the time, it will decrease the overall performance.
Plus, you'll introduce a maintenance problem when someone deletes records. In those cases, the records in this log table also needs to be deleted.
Brings me back on the thing I mentioned in the beginning... What you could do is combine both the history table and your regular tables. Whenever a record is inserted, modified or deleted, you would add a record into this modifications table, including a timestamp and user reference. This would maintain the history over your data and in general, you'd only be doing inserts into this table. This should still be fast. As an added bonus, you can recreate the whole contents of your database simply by replaying all actions inside this modifications table, just in case.
Inserts can be reasonable fast so the loss of performance is reasonable small, although this depends on your implementation.
But for whatever reasons, after learning about using modification tables, I never came in a practical situation where I could just use this technique.