Первый недостаток, который я вижу, заключается в том, что вам необходимо предоставить сервису приложений права ALTER.
Это подразумевает, что ваша модель безопасности нуждается в тщательном внимании, поскольку приложение сможет не только добавлять поля, но и удалять и переименовывать их, а также создавать некоторые таблицы (по крайней мере, для MySQL).
Во-вторых, как бы вы различали поля, обязательные для пользователя? Или к полям, созданным пользователем A, может обратиться пользователь B?
Обратите внимание, что количество элементов в столбцах также может значительно возрасти. Если каждый пользователь добавляет 2 поля, мы уже говорим о 200 полях.
Лично я бы использовал один из двух подходов или их комбинацию:
- Использование сериализованного поля
Я бы добавил одно текстовое поле в таблицу, в которой я бы хранил сериализованный словарь или словари:
{
user_1: {key1: val1, key2, val2,...},
user_2: {key1: val1, key2, val2,...},
...
}
Недостатком является то, что значения не легко найти.
- Использование таблицы с несколькими типами имя / значение
таблица полей:
user_id: int
имя_поля: varchar (100)
тип: enum ('INT', 'REAL', 'STRING')
таблица значений:
field_id: int
row_id: int # идентификатор строки главной таблицы
int_value: int
float_value: float
text_value: text
Конечно, требуется соединение, и его немного сложнее в реализации, но оно гораздо более общее и, при правильной индексации, весьма эффективно.