Это типичные отношения «многие ко многим» между пользователями и событиями.
Вам нужна третья таблица (скажем, UserEvent или лучше UserAttendsEvent или просто Attends), в которой будет строка для каждого пользователя и каждого события, которое он посещает.
Таким образом, он будет иметь как минимум userID и eventID как внешние ключи для таблицы User и Event.
Добавление индексов в эти 2 поля, вероятно, будет полезно для ваших запросов, поскольку вы планируете иметь миллионы строк.
UserEvent может также иметь другие данные, например, когда пользователь зарегистрировался для участия в мероприятии, деньги, которые он потратил на событие, понравилось ли ему это или нет, и т. Д.
Загвоздка в том, что в каждой строке есть информация о «посетителях». Кто посещал (userID), что посещал (eventID), когда он прибыл, сколько потратил во время и т. Д. Вы не хотите помещать эту информацию ни в таблицу User, ни в таблицу Event.
Поскольку вы беспокоитесь о производительности, я добавлю пример того, как база данных будет искать конкретный запрос. Допустим, мы хотим найти всех пользователей, которые посещают (или планируют) мероприятие «U2 концерт в Афинах, июль 2011 года» и имеют тот же день рождения, что и я.
database plan:
1. use eventTitle index in table Event
to find that the event has id 47519
(good for us that we have created such an index).
2. use eventID index in table Attends
to find all (469) userids that have attended eventid 47519.
3. use the userid index in table User
to find all the info of the 469 users.
4. search the info (birthdate) from those
to keep only those (3) that have birthday July 24th.
(we have not created any index that can be used here)
Таким образом, база данных обращается к дискам только для поиска индексов и чтения необходимых нам данных. Не читать все данные и искать в них.
В более сложных запросах или потому, что для запроса требуются все данные в таблице, или если необходимый индекс не был создан, или какой-то индекс бесполезен, или если оптимизатор запросов db решит, что он быстрее, он может сканировать таблицу или часть это и затем искать данные. Но если индексы " правильные " были определены (соответствующие вашему запланированному использованию), запросы будут быстрыми.