Сценарий работы:
Если олимпиада командная, то выводим список существующих команд и просим либо присоединиться к уже созданной, либо ввести название новой команды.
Если олимпиада личная, то просим ввести ник/логин пользователя, автоматически создаем команду запись в таблице team.
Сценарий работы:
Если олимпиада командная, то создаем olympiad_attribute c атрибутом team_title.
1) При регистрации это поле будет предложено заполнить, как и другие.
Если человеку уже выслано приглашение вступить в команду, то сразу добавляем для него запись user_olympiad, правда с ключом activate = false. Если он захочет зарегистрироваться, то активируем эту запись, заполняем недостающие поля.
2) При регистрации это поле не заполняется. Заполняется как в 1ом варианте в отдельной вкладке.
Таблицы user_value_olympiad (user_olympiad, value(int))
Одна таблица user_value_olympiad (user_olympiad, attribute, value)
Аргументы: т.к. итак по значению user можно найти все его участия в олимпиадах (user_olympiad)
Для того что бы не хранить много одинаковых строковых значений, можно добавить разрешающую таблицу values(value(int), value(string))