Your question is very typical design dilemma. For example, if you have database in normal form, and you have the following tables: sales, managers (who sells) and regions (where managers are working). You are building reports like "Yearly sales grouped by regions" where you joining sales with managers and managers with regions. But if one of the managers will relocate to another office during the year, seems that your report will show incorrect data, right?
What are 3 solutions
1) In some cases developers and analyst decide: well, our data is not very correct but it is OK for now, we want to stay with normal form and do not duplicate data. This solution is less complex. In this case you can create Callers and CallHistory tables in normal form, i.e. phone number will be in Callers table only.
2) There is a requirement not to lose any historical changes. And we want our reports and queries be very fast (at the cost of database size). In this case people decide to duplicate all fields. For example you can create CallHistory table that has phone number, callers name, address etc., because you anticipate that each of these fields can be changed in the future. Of course you can create Callee table as well (probably you will need it for another purposes) but it may be reefenced by CallHistory and may be not. Suppose that you think that some records need to be deleted from Callee but want them to be in CallHistory. This is the case when developers often think that they can violate referential integrity of the data, do not create any foreign keys from CallHistory table. And this is reasonable, because without foreign keys, inserts will work faster.
3) Approach I like more, but it is most complex from implementation point of view : CallHistory table should reference to CalleeHistory table. CalleeHistory table will have all fileds that Callee table has, but it also has a surrogate key, like CalleeID + DateModified (sometimes instead of DateModified developers use ModificationVersionNumber). In CallHistory we have a surrogate foreign key that reference CalleeID + DateModified. In this case you have normalized data (i.e. Phone number is not dublicated in different tables), and also you didnt lose any historical changes.
As far as I said, there is often a tradeoff between complexity of implementation, database performance, database size, data integrity and functional requirements to the system. If you are a junior developer, it is nice to have in mind all possible solutions, but probably you should listen to a senior developer, who knows about your system and requirements more than anybody on Stack Overflow.
p.s.
If you want to know about other approaches, read about Slowly changing dimensions, for example http://en.wikipedia.org/wiki/Slowly_changing_dimension