Update:
It's been a while I asked this question and now have found a convincing answer. In short - whether you choose to distribute your data across rows or across tables depends upon the data itself - and how frequently you wish to retrieve it.
Consider a User model.
A user has typical data like 'email', 'phone', 'password', 'city', 'state', 'country' etc. It'd be safe to assume that in about 90% of the requests that we make to the application; User model needs to be accessed.
Ask yourself this question - are you going to need to retrieve the User->city in every request?
Second,
Are you going to sort or fetch users by city?
Think about it. It's far easier to simply pull a user model and access its city than fetching a relationship [ User->belongsTo->City].
In the second case, we're introducing a relationship when it's really not needed. Of course, I'm taking a 'general overview' here of typical requests. It'd be far easier to have an extra column on User table to store 'City'; and make it 'nullable'.
Second, there are cases when you are forced to distribute your data in a normalized fashion.
For example, consider that you need to record activities of any user. You're going to need a separate table to record activity of the user; so that you can retrieve it by searching for 'user_id' column on the 'activity' table. You can then make use of the [ User->hasMany->Activity ] relationship.
The Database Engines Are Faster Than Ever!
Thanks to the Solid State Drives (SSDs) that read and write operations are far smoother and faster than a few years ago. This means, performance ain't a question even if you have millions of rows.
A simple 1GB server can easily process a database with a million rows without any issues; provided your queries are optimal and don't lead to memory leaks.
I hope this helps. If someone is struggling with their database design, post your question below.