Creating complete synthetic test data sets from production data

How easy could it be to generate a complete set of test data
from existing tables? To make sure that data looks like production
but in no way is a copy or scramble of production data. Instead it
is synthetically created, to look like what your production data looks
like. Same types, same data domain, same coherence between values, same data distribution
and also maintaining the relationships (foreign keys) between all the tables
simulating.