This isn't an exact science and you will surely find many opinions. Logically speaking, contact information is a function of a given client. If a client has many address, city, state and phone numbers you want to associate them with, then your model could be correct as you don't want repeating rows or columns. Also, if your contacts can share an address, you would be correct in assuming that they should be separate.
I think rather than buying a book about MySQL, you should get a book about relational databases (I will try to find the textbook I used when I was in school to give you the title, it was very good). Set theory, normalization and functional dependence are at the core of database architecture, hopefully Wikipedia will provide some insight into your problem.
From Wikipedia:
http://en.wikipedia.org/wiki/Functional_dependency
Given a relation (table) R, a set of attributes X in R is said to functionally determine another attribute Y, also in R, (written X → Y) if and only if each X value is associated with precisely one Y value. Customarily we call X the determinant set and Y the dependent attribute. Thus, given a tuple (row) and the values of the attributes in X, one can determine the corresponding value of the Y attribute. For the purposes of simplicity, given that X and Y are sets of attributes in R, X → Y denotes that X functionally determines each of the members of Y - in this case Y is known as the dependent set.
Read over that and let me know what your thoughts are.