Я должен несколько не согласиться с Чарльзом в том, что единственный способ сэкономить на производительности - это ненормализовать, чтобы избежать лишних запросов.
Чтобы быть более конкретным, есть оптимизация, которая будет работать без денормализации (и сопутствующих головной боли обслуживания / целостности данных), но ТОЛЬКО если база пользователей достаточно мала (скажем, <1000 пользователей, ради аргумента - зависит в наших масштабах. Наши приложения используют этот подход с 10k + отображений). </p>
А именно, у вас есть прикладной уровень (код, работающий на веб-сервере), извлекайте список пользователей в надлежащий кэш (например, с возможностью истечения срока действия данных). Затем, когда вам нужно напечатать имя первого / последнего пользователя, найдите его в кеше на стороне сервера.
Это позволяет избежать дополнительного запроса для каждого просмотра страницы (так как вам нужно только получить полный список пользователей ОДИН РАЗ за N просмотров страницы, когда истекает срок действия кэша или когда обновляются данные пользователя, что должно привести к истечению срока действия кэша).
Это добавляет крошечное время процессора и использование памяти на веб-сервере, но в «Ещё одной священной войне» (например, тратить больше ресурсов на стороне БД или на стороне сервера приложений) я твердо уверен в том, что «не тратьте ресурсы БД» «Лагерь, видя, как масштабировать БД гораздо сложнее, чем масштабировать веб-сервер или сервер приложений.
И да, если эта (или другая столь же хитрая) оптимизация неосуществима, я согласен с Чарльзом и Зедом в том, что у вас есть компромисс между нормализацией (меньше головной боли, связанной с целостностью данных) и увеличением производительности (на одну таблицу меньше). включите в некоторые запросы). Поскольку я являюсь агностиком в этой конкретной священной войне, я просто иду с тем, что дает лучшие предельные выгоды (например, сколько потери производительности в сравнении с тем, сколько затрат / риска от ненормализации)