È un requisito assoluto che aggiungano colonne alla tabella o semplicemente che possono specificare campi aggiuntivi da memorizzare? Ti suggerisco caldamente di prendere in considerazione qualcosa come Entity-Attribute-Value piuttosto che consentire all'utente finale (gli amministratori contano come utenti finali) di apportare modifiche allo schema.
Per qualcosa del genere, avresti una tabella per definire i tuoi campi personalizzati, quindi una tabella di associazione molti-a-molti per consentire all'utente di specificare un valore per un campo personalizzato per il contatto. Ad esempio:
Contact
---------
-> ContactId
| FirstName
| LastName
| etc.
|
| ContactField
| --------------
| ContactFieldId <---
| FieldName |
| |
| ContactFieldValue |
| ------------------- |
-- ContactId |
ContactFieldId -------------------------
Value
Le specifiche di implementazione dipendono ovviamente da te (ad esempio, se utilizzare ContactId + ContactFieldId
come chiave primaria composta in ContactFieldValue
), ma questo dovrebbe far passare l'idea generale.