As abordagens usuais para isso são:
- EAV
- hstore
- XML
- JSON
Ver:
- Design de banco de dados - devo usar 30 colunas ou 1 coluna com todos os dados em forma de JSON/XML ?
- https://dba.stackexchange.com/q/27057/7788
A coisa toda de "tornar colunas disponíveis para outros usuários" exige apenas que você mantenha uma tabela de "chaves personalizadas" que você adiciona sempre que um usuário define uma chave não utilizada anteriormente.
Adicionar colunas com DDL dinâmico parece razoável no início, mas há limites para quantas colunas você pode armazenar e quão "larga" uma linha pode ser. O desempenho da verificação da tabela piora à medida que você adiciona mais colunas, embora as colunas "esparsas" que são principalmente nulas sejam relativamente baratas. Um bloqueio exclusivo é necessário para adicionar uma coluna, algo que pode levar tempo para entrar em um sistema ocupado, embora adicionar a coluna seja muito rápido se ela não estiver definida como
NOT NULL DEFAULT ...
. Vai funcionar muito bem no começo, mas eu suspeito que você vai se arrepender de fazer isso mais tarde.