Keeping historical demographic information, while updating donor information
There are several approaches to handling this.  Custom fields are one approach.  Another is to use Detailed Logging, which will keep historical records, although they may not necessarily be in the format you most desire.  They also take up a lot of disk space, since you're keeping the history of every change in CiviCRM!

If you try the detailed logging approach, also considering installing the Extended Reports extension, which has reports that pull data from the log tables.