Your question is a very typical design dilemma. For example, if you have a database in normal form, and you have the following tables: sales, managers (who sells) and regions (where managers work). You create reports such as "Annual sales grouped by region", where you join sales with managers and managers with regions. But if one of the managers moves to another office within a year, it seems that your report will show incorrect data, right?
What are 3 solutions?
1) In some cases, the developers and the analyst decide: well, our data is not very correct, but now everything is in order, we want to stay in a normal form and not duplicate the data. This decision is less complicated. In this case, you can create the Callers and CallHistory tables in the usual form, i.e. The phone number will only be in the Callers table.
2) There is a requirement not to lose any historical changes. And we want our reports and queries to be very fast (due to the size of the database). In this case, people decide to duplicate all the fields. For example, you can create a CallHistory table that has a phone number, caller name, address, etc., since you expect each of these fields to be changed in the future. Of course, you can also create a Callee table (you may need it for other purposes), but it may be called by CallHistory, or it may not. Suppose you think that some entries need to be deleted from Callee, but you want them to be in CallHistory. This is the case when developers often think that they can violate the referential integrity of the data, do not create any foreign keys from the CallHistory table. And this is reasonable, because without foreign keys, inserts will work faster.
3) Approach I prefer it, but it is the most difficult from the point of view of implementation: the CallHistory table should refer to the CalleeHistory table. The CalleeHistory table will have all the records that are in the Callee table, but it also has a surrogate key, for example CalleeID + DateModified (sometimes ModificationVersionNumber is used instead of DateModified developers). In CallHistory, we have a surrogate foreign key that references CalleeID + DateModified. In this case, you have normalized data (i.e. the phone number is not duplicated in different tables), and also you have not lost any historical changes.
As I said, implementation complexity, database performance, database size, data integrity, and system functional requirements often arise. If you are a junior developer, it’s nice to keep in mind all the possible solutions, but you should probably listen to a senior developer who knows more about your system and requirements than anyone else from Stack Overflow.
ps
If you want to learn about other approaches, read about slowly changing dimensions, for example http://en.wikipedia.org/wiki/Slowly_changing_dimension