Я бы, вероятно, установил "нормальную" структуру таблицы для "обычных" битов данных (имя, адрес, телефон и т. Д.), А затем имел бы отношение один-> много к отдельной таблице "custom_fields" который содержит три столбца:
user_id (чужой глаз), тип поля (строка), данные (строка / блоб)
В качестве альтернативы вы можете просто добавить BLOB-объект или текстовое поле в главную таблицу контактов, которая содержит отформатированный список пользовательских сопоставлений полей / значений (вы можете использовать BSON, JSON или YAML, чтобы упростить жизнь). Затем просто распакуйте данные, когда пользователь откроет контакт.
Если вам нужна более быстрая производительность и возможность легко сортировать контакты по настраиваемому полю, вы можете обратиться к серверным базам данных, ориентированным на документы, таким как MongoDB, или даже к поисковой системе (SOLR или Google. Может быть, это излишне, но также может быть интересным проектом!
Существует множество способов связать пользовательские поля и значения с записями в «нормальной» базе данных. Просто выберите тот, который вы понимаете и можете написать быстро, и сделайте это. Я никогда не видел, чтобы компания / работодатель заботились о «соответствии стандартам» внутренней системы хранения данных. Пока вы пишете какой-то сценарий экспорта или (как уже упоминалось) пишете плагины для поддержки бесшовного импорта / экспорта VCARD / XML , вы можете утверждать, что ваше приложение соответствует стандартам.