SQL запрос - 2 @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 7 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Заголовок сообщения: SQL запрос - 2
Сообщение Добавлено: 14 Июль 2007, 23:06:10 
Таблица состоит из 2-х столбцов.
В колонке 1 - свойства товара
В колонке 2 - цена (индекс)

Код:
           COL 1 | COL 2
-------------------------
стандарт. размер | 1
       полноцвет | 1
          глянец | 1

стендарт. размер | 2
       полноцвет | 2
  обычная бумага | 2


ОПИСАНИЕ ПРОБЛЕМЫ:

Когда клиент выбирает товар (печатная продукция) он должен выбрать отличительные свойства, например:
- размер визитной карточки
- метод печати
- тип бумаги

В зависимости от комбинации выбранных опций - обуславливается цена.

К ПРИМЕРУ:

если выбранный товар имеет:
• стандарт. размер
• полноцвет
• глянец

то его цена (индекс) будет: 1


ТАБЛИЦА ДЛЯ УПРОЩЕНИЯ:

Код:
COL 1 | COL 2
-------------
    a | 1
    b | 1
    x | 1

    a | 2
    b | 2
    y | 2


ЗАДАЧА:

Имеем свойства товара:
a, b, x

Надо найти его цену (которая будет равна 1).


ЗАПРОС (который работает):

Код:
SELECT col2 FROM prices WHERE col1 IN ('a', 'b', 'x')
GROUP BY col2
HAVING (COUNT( col1 ) = '3')


Тему я уже открывал ранее:
http://deforum.ru/forum/viewtopic.php?t=44048

и мне сказали что у меня неправильная структура и надо описать саму задачу. На том топик и закончился. Поэтому вот открываю еще. Можно ли сделать иначе (и лучше) чем сейчас?

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
diezel2005 Муж.
новый человек
16
Сообщения: 140
Зарегистрирован: 12.08.06
Откуда: Украина
Сообщение Добавлено: 15 Июль 2007, 01:06:41 
Если все свойства обязательны к заполнению, проще хранить хэши комбинаций с ценами, чем каждый раз гонять базу по
Код:
WHERE col1 IN ('a', 'b', 'x')

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

_________________
Не можешь вынести хамства? Сосчитай до десяти и вынеси хама.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 15 Июль 2007, 01:40:41 
diezel2005,
с хешами никогда не работал, надо будет посмотреть.
По английски это HASH называется?

Свойства не обязательны к заполнению.
Их можно сделать обязательными, включив "NULL" как одну из опций свойства.

Но товар может менятся: свойства могут добавляться и удаляться.
В идеале цены не связанные с удаленным свойством должны остаться.

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 15 Июль 2007, 02:14:19 
ну в принципе я понимаю о чем речь.
если для каждого варианта будет уникальный хеш - то можно будет его проиндексировать - верно?

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
diezel2005 Муж.
новый человек
16
Сообщения: 140
Зарегистрирован: 12.08.06
Откуда: Украина
Сообщение Добавлено: 15 Июль 2007, 16:20:34 

Цитата:
Но товар может менятся: свойства могут добавляться и удаляться.


Строго говоря, в таком случае тебе нужно будет сначала пересчитать хеши без удаленного свойства, а потом уже чистить саму базу.
Вообще, хэш - это общий случай. Тебе могут помочь даже упорядоченные комбинации свойств в поле Varchar. Как пример - реализация свойств текстуры и цвета на http://www.myfoofstore.com/fuf-chaise-lounger-p-57.html - здесь, зная что в комбинации свойств первым всегда идет текстура, затем цвет, я не заморачиваюсь с просчетом хешей, а просто храню их в виде "([код текстуры], [код цвета])". Естественно, что в базе это храниться вместе с кодом товара и, скажем, картинкой-примером.

_________________
Не можешь вынести хамства? Сосчитай до десяти и вынеси хама.
AlexShop Муж.
участник
34
Сообщения: 1866
Зарегистрирован: 17.02.04
Сообщение Добавлено: 15 Июль 2007, 19:37:29 
diezel2005,
попробую суммировать:

Просто перечислить свойства через запятую + знать порядок свойств.

Некоторые продукты будут иметь свои уникальные свойства, которых другие продукты не будут иметь.
Поэтому в базе сделать таблицу, где порядок будет описан для каждого продукта (естественно индексами), например:
Код:
визитная карточка - бумага, размер, цвета, лакировка
бланк - бумага, цвета

Порядок свойств не критичен для нахождения цены - потому что цена все равно будет искаться по уникальной комбинации цыфр.
Но логика заложенная в упорядочивании свойств - ускорит просчет при удалении свойства и добавления новых. Плюс удобно просматривать БД.

Теперь надо подумать о целостности БД и возможных ошибках.

Например ошибка, где продукт имеет такие свойства:
Код:
a, b, x - 1 (одна цена)
a, x, b - 2 (другая цена)

С точки зрения уникальности - эти две строки уникальны. Значит при поиске цены - надо будет тоже учитывать прорядок свойств (на всякий случай).

Чем мне нравится моя схема, это:
- порядок свойств не важен и такая ошибка в принцине не возможна.
- каждое свойство (в COL1) присоединено внешним ключем к таблице всех свойств (что уже не возможно при использования хешей).

Но чем мне нравится твоя схема:
- скорость нахождения цены
- компактность таблицы (вариантов)
- легкое чтение неворуженным глазом (даже такие ошибки легко выявить простой сортировкой :up: )
А что бы проверять целостность, пару триггеров можно написать.

_________________
Тот, кто задает вопрос, глупец в течение пяти минут, тот, кто его не задает, глупец всю свою жизнь. (Китайская поговорка)
diezel2005 Муж.
новый человек
16
Сообщения: 140
Зарегистрирован: 12.08.06
Откуда: Украина
Сообщение Добавлено: 15 Июль 2007, 21:16:54 
Ну, тут уже вопрос приоритетов.
Для меня всегда критична

Цитата:
скорость нахождения цены.


поскольку не хотелось бы обновлять код при резко возросшей нагрузке на сайт. IN - не самая быстрая проверка для частого использования, поэтому мне проще один раз вычислить что-то в коде, а потом это искать, чем делать ресурсоемкие запросы для нахождения элемента.
Вопрос целостности, наоборот, критично не стоял, поскольку основная база - на сервере или рабочем месте. Когда я начну писать 100% веб-сервисы - тогда уже я буду задавать вопросы про проверку целостности :beer:

_________________
Не можешь вынести хамства? Сосчитай до десяти и вынеси хама.
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 7 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100