Первое, что приходит на ум, это то, что поиск animals > zoos > tenants
медленнее, чем просто animals > tenants
. И, скорее всего, это поиск, который вы будете делать часто (например, «получить всех животных для определенного арендатора, независимо от зоопарка»).
Для небольших и средних приложений вы можете получить более нормализованную структуру, но ради эффективности вы должны использовать посторонние данные (и, вообще говоря, многопользовательские приложения не малы). Просто убедитесь, что он не «не синхронизирован», что представляет собой риск, связанный с наличием избыточных данных.
Чтобы ответить на ваш последний абзац, причина в производительности, чистой и простой. Присоединения не плохая вещь; они помогают вам хранить данные в одном месте, а не в трех. Это определенно не для предотвращения ошибок. Добавление поля tenant_id
к большему количеству таблиц увеличит риск ошибок (хотя для идентификатора, который никогда не изменяется, это не будет такой большой проблемой).