I've had to reverse engineer several existing complex data sets. The most important thing to establish are the keys and dependencies in the data. The problem is frankly NP hard, so some intuition and inspection will go a long way to getting you to a sensible answer, so don't count on a simple "turn the crank" solution unless you've got a lot of time on your hands. What you need to do is to query the data a column at a time and by combinations of columns. You want frequency distributions for column values (and column combination values). Columns (or combos) with maximum frequencies of 1 are candidate keys. You can also look at frequency distributions of combinations of columns to find potential hierarchies. In your example each value in `Col2` only ever has one value in `Col1` and so forth. When you identify candidate keys and dependencies between columns you can apply normalization. ----- **EDIT:** In response to OP's quesiton in comments: This is a query that would tell you whether or not one column may have a functional dependency on another column: select COL2 from MYSTERY group by COL2 having count(distinct(COL1)) <> 1 If `COL2` has a functional dependency on `COL1` then this query would return 0 rows. This is because every value of `COL2` has exactly 1 corresponding value of `COL1`.