I don't think I'd attempt to split them in to 3 tables. Problem is, a town can related to many zip codes, many codes to one state, but worse, the same town name can be in several states, thus all have different zips. Consider one table and create a unique index on 3 fields - Town, State and PostalCode. That way you can have as many Springfields as you want but the combination of state and code will make them unique. This would also cover of the possibility (?) that a state has 2 towns with the same name or spelling variation. Don't know if exists or not.
Accuracy would then be achieved by a state combo. The town list is then filtered according to the state chosen. The codes are then filtered to whatever matches the state and towns selected. That's known as cascading combo boxes.
That's my take, for what it's worth.
The more we hear silence, the more we begin to think about our value in this universe.
Paraphrase of Professor Brian Cox.