I'm not as experienced in the core as many other people here, but if I was implementing this from scratch, the first thing I would think of is to create a separate table, like Malte suggests, and then create an admin UI which allows admins to dynamically add and remove columns from this table.
This actually wouldn't be too hard to do. In project-manager, I use this to add custom fields to the projects table:
select content_type__create_attribute(
'pm_project',
'customer_id',
'integer',
'Customer',
'Customers',
null,
null,
'integer constraint pm_project_customer_fk references organizations'
);
This associates a customer with every project.
You could create a UI to allow admins to add in columns dynamically.
Then, you could have a reference to telecom-number, postal-address, or any other UI. The downside is that it's not user friendly at all, but is mostly geared towards developers.
Which is actually big enough of a disadvantage that I'd consider doing something else.
Just a thought.