2012-05-19 2 views
0

Я прочитал сегодня это сообщение в блоге http://www.andrewrollins.com/2009/06/21/mysql-join-performance/ о совместном выступлении. Как видно, объединение может стоить производительности в некотором роде.Mysql join vs имеет дубликат

Давайте рассмотрим пример из двух таблиц: user_profile и user_gallery.

user_profile 
user_id | avatar | nickname | ... 

user_gallery 
image_id | user_id | image | caption | is_avatar 

На странице просмотрите пользователей, пользователи указаны с их псевдонимом и изображением аватара.

я могу получить изображение в списке пользователей с присоединиться

INNER JOIN user_gallery ON user_gallery.user_id=user_profile.user_id WHERE user_gallery.is_avatar=1 

или я могу положить аватар поля контур изображения. В этом случае мне не нужно использовать поле is_avatar, и у меня есть все данные, необходимые для отображения пользователей в таблице user_profile. Поэтому никакого дополнительного соединения не требуется. Но поскольку изображение аватара является частью галереи пользователей, это будет означать значение avatar также в таблице user_gallery, поэтому одно дублирующее значение.

Стоит ли строго следовать правилам нормализации, которые могут стоить производительности, имея в виду этот точный случай? Что было бы лучше в этом случае?

+0

Я не понимаю, о необходимости присоединения к 'user_profile', если вы не нуждаясь столбцами из него , В противном случае я не вижу, как работает поле user_profile.avatar, когда может быть несколько изображений для данного профиля пользователя ... –

+0

Один пользователь может отображать только 1 аватар и изображение аватара на странице списка пользователей (просматривать пользователей). В режиме просмотра пользователей это список пользователей с их псевдонимом, возрастом и аватаром. На странице просмотра пользователей аватар - это ссылка на профиль пользователя. Я не уверен, что вы имеете в виду, не требуя от него столбцов. Мне нужно просматривать данные страниц пользователей о прозвище, возрасте и аватаре. Когда вы находитесь на странице профиля пользователя, вы также можете увидеть галерею пользователей. Изображение аватара автоматически становится частью галереи пользователя, когда пользователь регистрируется. – JohnyFree

ответ

1

Логический выбор, мне кажется, отказаться от is_avatar поля и просто user_profile.avatar ссылаться на image_id ...

+0

Это основано на нормальных нормализационных принципах, которые, на мой взгляд, всегда должны быть первой проблемой, пока вы не знаете, что производительность является проблемой. В этом случае это не должно быть дорогостоящим, так как вы будете делать только одно дополнительное чтение записи user_gallery, проиндексированной его основным ключом. –

+0

Мне нужно иметь в виду, что позже я смогу принять решение также отображать город, это будет дополнительное соединение, потому что названия городов находятся в другой таблице. – JohnyFree

+0

И я уже использую другое соединение с таблицей user_account, потому что мне нужно отображать только пользователей, у которых есть значение поля is_active 1. Поэтому я обеспокоен ограничением объединений как можно больше. – JohnyFree