Los enfoques habituales para esto son:
- EAV
- hstore
- XML
- JSON
Ver:
- Diseño de base de datos:¿debería usar 30 columnas o 1 columna con todos los datos en forma de JSON/XML? ?
- https://dba.stackexchange.com/q/27057/7788
Todo el asunto de "hacer que las columnas estén disponibles para otros usuarios" solo requiere que mantenga una tabla de "claves personalizadas" a la que agregue cada vez que un usuario defina una clave no utilizada previamente.
Agregar columnas con DDL dinámico suena razonable al principio, pero hay límites en la cantidad de columnas que puede almacenar y cuán "ancha" puede ser una fila. El rendimiento del escaneo de la tabla empeora a medida que agrega más columnas, aunque las columnas "escasas" que en su mayoría son nulas son relativamente baratas. Se requiere un bloqueo exclusivo para agregar una columna, algo que puede tomar tiempo para entrar en un sistema ocupado, aunque agregar la columna en sí es muy rápido si no se define como NOT NULL DEFAULT ...
. Funcionará bastante bien al principio, pero sospecho que te arrepentirás de hacerlo más tarde.