É um requisito absoluto que eles adicionem colunas à tabela , ou apenas que eles possam especificar campos adicionais para armazenar? Eu sugiro fortemente que você considere algo como Entity-Attribute-Value em vez de permitir que o usuário final (os administradores contam como usuários finais) faça alterações no esquema.
Para algo assim, você teria uma tabela para definir seus campos personalizados e, em seguida, uma tabela de associação de muitos para muitos para permitir que o usuário especifique um valor para um campo personalizado para o contato. Por exemplo:
Contact
---------
-> ContactId
| FirstName
| LastName
| etc.
|
| ContactField
| --------------
| ContactFieldId <---
| FieldName |
| |
| ContactFieldValue |
| ------------------- |
-- ContactId |
ContactFieldId -------------------------
Value
As especificidades da implementação obviamente dependem de você (por exemplo, se deve usar
ContactId + ContactFieldId
como uma chave primária composta em ContactFieldValue
), mas isso deve transmitir a ideia geral.