На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> правильная структура БД "авто объявления"
    Цитата Спящий @
    В любом случае, это 2-3 таблицы, а не 4.
    1) Таблица объектов (системная инфа, видимость, автор, дата постинга, просмотры)
    2) Таблица параметров
    3) Таблица значений
    4) Таблица-связка 2-3

    Добавлено
    Спящий, что считать основными параметрами это другое, я примеры того что считаю основными написал - это внутренние поля объекта, цену туда можно тоже включить.

    Добавлено
    Akina, тут я придумал вариант который наверно все же будет быстрее, чем предполагаемый мной ранее джоин на каждое условие. Но проверить я не могу к величайшему сожалению. Можно без IN, суть именно в постановке условий.
    Запрос вида
    ExpandedWrap disabled
      SELECT *
      FROM `auto`
      WHERE `id` IN (
       SELECT `autoId`
       FROM `values`
       WHERE
        (`paramId` = 10 AND `value` = 12) OR
        (`paramId` = 11 AND `value` = 'Седан') OR
        (`paramId` = 12 AND `value` = 'Желтый')
       GROUP BY `autoId`
       HAVING COUNT(`value`) = 3
      )
    3 - это количество параметров в условии. Используя такой запрос появляются плюсы.
    1) Решается проблема с количеством условий, если уж запрос привысил max_allow_packet, который увеличивается до достаточно больших размеров (по-умолчанию 8мб). Решается с помощью занесения условий во временную таблицу. Изврат, но и проблемы такой не будет, но для чистоты это хорошее свойство, уперется можно разве только в размер временнной таблицы.
    2) Более полезное преимущество это видимость количества совпавших условий, следовательно можно создавать нечеткий поиск "у нас не нашлось подходящей машины но есть очень похожая". Так сказать получается автоматически релевантный поиск одним запросом.

    Добавлено
    Кстати хранение параметров в одной строке тоже когда-нибудь упрется в ограничение сложности запроса, так что это вариант еще и лучше.
      Цитата Pr0[)!9Y @
      1) Таблица объектов (системная инфа, видимость, автор, дата постинга, просмотры)
      2) Таблица параметров
      3) Таблица значений
      4) Таблица-связка 2-3
      Не понимаю, зачем заводить отдельно таблицу-связку. Принципиально хочется иметь таблицу из одних идентификаторов?
      Цитата Pr0[)!9Y @
      Спящий, что считать основными параметрами это другое, я примеры того что считаю основными написал - это внутренние поля объекта, цену туда можно тоже включить.
      ИМХО, конечно, но основными имеет смысл делать только поля, входящие в первичный ключ. Хотя конечно, можно таким образом избавиться от дополнительных запросов/джойнов, но при грамотно расставленых ключах это будет давать прирост производительности только на совсем огромных базах.
        Цитата Спящий @
        Принципиально хочется иметь таблицу из одних идентификаторов?
        Цитата (Pr0[)!9Y @ 7.12.09, 16:31)

        Цитата Pr0[)!9Y @
        3) Таблица значений
        Таблица возможных значений\подтановок. Так правильнее.
          Цитата Pr0[)!9Y @
          Таблица возможных значений\подтановок. Так правильнее.
          Это понятно. Таблица связей зачем отдельно от таблицы объектов?
            Потому что у одного объекта много свойств, а свойства ограничены установленным списком.
              Цитата Pr0[)!9Y @
              тут я придумал вариант который наверно все же будет быстрее, чем предполагаемый мной ранее джоин на каждое условие. Но проверить я не могу к величайшему сожалению.

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

              Добавлено
              Цитата Спящий @
              Не понимаю, зачем заводить отдельно таблицу-связку. Принципиально хочется иметь таблицу из одних идентификаторов?

              Скорость, скорость. Работать только с индексами, без значений - намного быстрее.
                Цитата Akina @
                Скорость, скорость. Работать только с индексами, без значений - намного быстрее.
                Интересно получается. Т.е. если в таблице галимые индексы, то она работает быстрее, чем если таже таблица, но хотя-бы с одним неиндексированым полем? И намного?
                  Альтернативы нет =) С голыми значениями не получится никак сделать.
                  У строк должен быть идентификатор разный, если это разные вещи, а что значение совпадает это случайности.
                    Цитата Спящий @
                    И намного?

                    А насколько скан таблицы медленнее поиска по индексу. Сортированному, кстати.
                      Дак никто-ж не собирается искать не_по_индексу. Или это сама СУБД будет зачем-то делать?
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0386 ]   [ 15 queries used ]   [ Generated: 30.04.24, 21:09 GMT ]