SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.10.2010 13:54:38

ispolin08
Участник
Зарегистрирован: 15.10.2010
Сообщений: 1

хранить в одной таблице, или inner join с другим таблицами

Доброго времени суток. Возник такой вопрос.
Есть допустим таблица на 400к строк, описывающая скажем пользователей.
Некоторых из них (штук 100-200МАКС) мне нужно отметить флагом. Допустим ВИП юзеры. Имеет ли смысл хранить булево значение как столбец таблицы юзерс, или лучше сделать vipusers и по id хранить флаги ? При выборке, естественно использовать join ?

Аналогом вопроса может стать допустим расклад в котором есть таблица пользователей и только 1% заполняет поле "о себе"(текст). Возможно имеет смысл также разбивать на две таблицы, чтобы не хранить пустые поля в большой таблице ?

Видел такие решения у некоторых программистов, дальше мне рассказывали что пишется хранимая процедура, и собирает чтото кудато на уровне  базы, и маол мегобыстро работает и оптимально и т.п

Сам сколько не читал книг по мускулю везде говорят о неидеальности хранимых процедур и зла от джойнов smile

Заранее спасибо smile

Неактивен

 

#2 15.10.2010 14:20:28

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: хранить в одной таблице, или inner join с другим таблицами

привет.
по первому вопросу.
заводите отдельную табличку для ВИП юзеров и храните там id. Наличие id юзера в табличке уже само по себе флаг. при выборке ТОЛЬКО ВИП юзеров строите запрос от этой таблицы, к ней inner join общей таблицы юзеров. Процедура "отметить флагом ВИП юзера" превращается в банальный insert в табличку с одним полем.

ispolin08 написал:

допустим расклад в котором есть таблица пользователей и только 1% заполняет поле "о себе"(текст)

если это поле не используется в условиях запроса, то не имеет особого смысла выносить его в отдельную таблицу. правды тут есть оговорки: если поле "о себе"  типа СHAR или TEXT, то имеет смысл вынести. Поле типа CHAR будет занимать место, даже если пустое, поле типа TEXT, при исполнении запроса с использованием временной таблицы(в EXPLAIN - using temporary table) заставит МySQL создавать временную таблицу на диске, что не очень хорошо отразится на производительности.

а по поводу "зла от джойнов" - они(авторы книг) IMHO просто не умеют их готовить :-)

Неактивен

 

#3 15.10.2010 14:29:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: хранить в одной таблице, или inner join с другим таблицами

Про «не умеют готовить join согласен», про отдельную табличку — нет wink

Ну, точнее, не совсем. В отдельную табличку стоит утаскивать тогда, когда наличие
VIP ни на что не влияет (или влияет на очень небольшое количество запросов). Если
же VIP Вы вытаскиваете почти в каждом запросе, то отделять в отдельную табличку
нет смысла — все равно будете каждый раз вытаскивать эти данные.

Неактивен

 

#4 15.10.2010 14:38:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: хранить в одной таблице, или inner join с другим таблицами

Посмотрите обсуждение этого вопроса в теме http://sqlinfo.ru/forum/viewtopic.php?id=209

Неактивен

 

#5 15.10.2010 15:46:30

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: хранить в одной таблице, или inner join с другим таблицами

да, paulus, пожалуй с хранением ВИП-признака в отдельной таблице я сплоховал. при обычной работе с пользователями(получение записи о пользователе по уникальному полю) предложенный мной вариант мягко говоря не совсем хорош.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson