¿Es un requisito absoluto que agreguen columnas a la tabla , o simplemente que puedan especificar campos adicionales para almacenar? Le sugiero encarecidamente que considere algo como Entidad-Atributo-Valor en lugar de permitir que el usuario final (los administradores cuentan como usuarios finales) realice cambios en el esquema.
Para algo como esto, tendría una tabla para definir sus campos personalizados, luego una tabla de asociación de muchos a muchos para permitir que el usuario especifique un valor para un campo personalizado para el contacto. Por ejemplo:
Contact
---------
-> ContactId
| FirstName
| LastName
| etc.
|
| ContactField
| --------------
| ContactFieldId <---
| FieldName |
| |
| ContactFieldValue |
| ------------------- |
-- ContactId |
ContactFieldId -------------------------
Value
Los detalles de la implementación obviamente dependen de usted (por ejemplo, si usar ContactId + ContactFieldId
como clave principal compuesta en ContactFieldValue
), pero esto debería transmitir la idea general.