About 20 years ago, I learned that the best way to handle this information is to simply paste it into a database. You should not modify existing entries and specifically do not delete entries. Basically, what you will store is not the data itself, but the data modifications. As a result, you simply get a single table that could do everything you need if you had enough processor / disk speed to view all the data in order to calculate the data based on these inserts.
Saving only changes will allow you to keep a complete history of all your data, which allows you to be extremely flexible. Basically, you only need one table containing everything. The disadvantage is that you need to do a lot more computation and need a lot more reading on disk, so you need tricks to speed up the process. Flexibility through productivity ...
In this case, you will have a similar problem. Access to a single table can be obtained from all that would need to add or update records. This will be your bottleneck. It is still great in a single-user environment since only one user will use it. In a low-maintenance environment, it can still have very good performance. But if you have 250 users who are constantly accessing this table, this will reduce overall performance.
In addition, you will find a maintenance problem when someone deletes entries. In these cases, you also need to delete entries in this log table.
It brings me back to what I mentioned at the beginning ... What you can do is combine the history table and regular tables. Whenever a record is inserted, changed, or deleted, you will add a record to this change table, including a time stamp and a user link. This will save the history according to your data, and in general you will only do inserts into this table. It should be fast. As an added bonus, you can recreate the entire contents of your database by simply replaying all the actions inside this change table just in case.
Inserts can be reasonable quickly, so the loss of performance is reasonably small, although it depends on your implementation.
But for some reason, learning about the use of modification tables, I never came into a practical situation where I could just use this technique.