Database design: how to handle the "archive" problem?
It's not clear to me if these requirements are for auditing purposes or just simple historical reference such as with CRM and shopping carts.

Either way, consider have an main and main_archive table for each major area where this is required.  "Main" will only have current / active entries whereas "main_archive" will have a copy of everything that ever goes into main.  Insert / update into main_archive can be a trigger from insert / update into main.  Deletes against main_archive can then run across a longer period of time, if ever.

For the referential issues such as Cust X bought Product Y, the easiest way to solve your referential concern of cust_archive -> product_archive is to never delete entries from product_archive.  Generally, churn should be much lower in that table so size shouldn't be too bad of a concern.

HTH.