В комментариях я видел, как вы говорили, что поля UDF предназначены для вывода импортированных данных, которые не отображаются пользователем должным образом.
Возможно, другой вариант - отследить количество пользовательских функций, созданных каждым пользователем, и заставить их повторно использовать поля, сказав, что они могут использовать 6 (или некоторые другие одинаково случайные ограничения) верхних значений пользовательских полей.
Когда вы сталкиваетесь с такой проблемой структурирования базы данных, часто лучше вернуться к базовому дизайну приложения (в вашем случае системе импорта) и наложить на него несколько ограничений.
Теперь я бы выбрал вариант 4 (РЕДАКТИРОВАТЬ) с добавлением ссылки для пользователей:
general_data_table
id
...
udfs_linked_table
id
general_data_id
udf_id
udfs_table
id
name
type
owner_id --> Use this to filter for the current user and limit their UDFs
string_link_id --> link table for string fields
int_link_id
type_link_id
Теперь убедитесь, что вы создали представления для оптимизации производительности и получения правильных индексов. Этот уровень нормализации уменьшает размер базы данных, но делает ваше приложение более сложным.