Take the 2-minute tour ×

I'm designing a contact manager/address book-like application but can't settle on the database design.

In my current setup I have a Contact, which has Addresses, Phonenumbers, Emails, and Organizations. All contact properties are currently separate tables with a fk to the Contact table. Needless to say a contact can have any number of these properties.

Now, I find myself joining all these tables together if I want to read contacts into the app. Since no filters, reverse lookups, sorts etc. are performed on the related tables, isn't it a better/simpler solution to just store the related fields as json-encoded lists on direct properties of the Contact table?

E.g., instead of a Contact with a fk to a phonenumber table with 3 entries, just encode all phonenumbers and store them into a field of the Contact table?

Any insights really appreciated! (fyi I'm using Django although that doesn't really matter)

share|improve this question
add comment

3 Answers

up vote 6 down vote accepted

Can you guarantee that your app will never grow to need these other functionalities? Do you really want to paint yourself into the corner such that you can't easily support all of this later?

Generally, denormalization happens only for preformance reasons. And then, a copy of the normalized data is still kept for live work and the denormalized data is used for offline processing where having a static snapshot is fine.

Get used to writing joins. That's the way SQL works. Having to do so doesn't meant something is wrong.

share|improve this answer
+1...I agree 100%! –  John Hartsock Dec 23 '10 at 0:34
add comment

I know I'm too late, but for anyone with the same issue.

IMO, in this case metadata modeling is the way to go. http://searchdatamanagement.techtarget.com/feature/Data-model-patterns-A-metadata-map

share|improve this answer
add comment

Sounds like you propose taking data currently modelled as five SQL tables and converting it to a common multi-valued type (does your SQL product have good support for this?) The only way I can see this would constitute 'denormalization' would be if you were proposing to violate 1NF, at which point you may as well abandon SQL as a data store because your data would no longer be relational! Otherwise, your data would still be normalized but you will have lost the ability to query its attributes using SQL (unless your SQL product has extensions for querying multi-value attributes). The deciding factor seems to be: do you need to query these attributes using SQL?

share|improve this answer
add comment

Your Answer


