У всех трех вариантов есть свои преимущества и недостатки.Какой из них лучше, зависит от деталей, которые вы не предоставили.В общем, не беспокойтесь о выборе трех или четырех записей из ста тысяч, если настроенные вами индексы позволяют выбрать правильную стратегию поиска.Если вы не понимаете индексацию, вы, вероятно, будете в беде независимо от того, какой из трех вариантов вы сделаете.
Если бы это был я, я бы выбрал вариант B. Я бы также сохранил любые атрибуты.напоминания в таблице для напоминаний.
Будьте очень осторожны с тем, определяете ли вы событие только по EventId или по (UserId, EventId).Если вы выберете последний вариант, вам следует использовать составной первичный ключ для таблицы событий.Не беспокойтесь слишком о составных первичных ключах, особенно с Firebird.
Если вы объявляете составной первичный ключ, помните, что объявление (UserId, EventId) не будет иметь таких же последствий, как объявление (EventId, UserId).Они логически эквивалентны, но структура автоматически сгенерированного индекса будет отличаться в двух случаях.
Это, в свою очередь, повлияет на скорость запросов, таких как «найти все напоминания для данного пользователя».
Опять же, если бы это был я, я бы избегал выбора С. Введение вредной избыточности в схему влечет за собой ответственность за очень тщательное программирование при обновлении данных.В противном случае вы можете получить базу данных, которая хранит противоречивые версии одного и того же факта в разных местах базы данных.
И, если вы действительно хотите узнать влияние на производительность, попробуйте все три способа, загрузите сПроверьте данные и сделайте свои собственные тесты.