|
|
|
| На данный момент есть табличка с подробными данными объекта (товара, организации...), там указан номер категории, к которой этот объект принадлежит. Отдельно табличка категорий.
Хочется сделать возможность для добавления объекта в несколько категорий.
Как лучше такое организовать, да чтоб еще нормально можно было производить поиск по базе объектов, выборку для конкретной категории и пр.
В табличке с данными по объекту записывать в столбец для категории несколько значений - вряд ли оптимально - при простой выборке для определенной категории проверить этот столбец для всех объектов...
Видимо, надо создать дополнительную таблицу для экземпляров объекта по категориям?
Только как тогда с поиском, не соображу пока... | |
|
|
|
|
|
|
|
для: Ivan
(26.12.2006 в 17:48)
| | Да в этом случае прибегают к допольнительной таблице... не очень понятны затруднения с поиском, вы же будете искать по таблице объектов? | |
|
|
|
|
|
|
|
для: cheops
(26.12.2006 в 18:34)
| | Поиск... имел в виду выборку по какому-нибудь критерию, допустим - цена товара, и по категории объекта
Цена будет храниться в таблице объектов, а категории -в таблице экземпляров объектов
Тогда как примерно должна идти выборка? скажем, отсортировать объекты данной подкатегории по стоимости
путаюсь с составлением запроса в базу.. | |
|
|
|
|
|
|
|
для: Ivan
(26.12.2006 в 19:02)
| | В этом случае придётся воспользоваться многотабличным запросом. Приведите структуру ваших таблиц? | |
|
|
|
|
|
|
|
для: cheops
(26.12.2006 в 19:18)
| | Объект:
id, cat(категория), name(название), descr(краткое описание), description(описание), price(цена) ...... куча других параметров....
Категории:
id, parent(родительская категория), descr(описание категории), items (кол-во объектов в категории и подкатегориях)..... некоторые другие параметры
Если добавляем таблицу objects_clones, то пишем в нее столбцы, допустим - clone_id, cat_id, obj_id
То есть запрос был примерно такой:
SELECT * FROM objects WHERE cat = 222 AND price>100 LIMIT 0,20 | |
|
|
|
|
|
|
|
для: Ivan
(26.12.2006 в 19:31)
| | Теперь запрос будет выглядеть примерно следующим образом
SELECT objects.* FROM objects, objects_clones
WHERE objects.id = objects_clones.obj_id AND objects_clones.cat_id = 222 AND price>100
LIMIT 0,20
|
| |
|
|
|
|
|
|
|
для: cheops
(26.12.2006 в 19:18)
| | Сразу еще вопрос, многотабличный запрос будет шустрее, скажем, полнотекстового поиска?
Просто, если все же взять и записать в столбец для категории объекта строку из массива уникальных значений категорий, сделать fullindex и искать себе каждый раз.
Тогда доп. таблица ни к чему, и даже кой-какие преимущества, кажется, есть... | |
|
|
|
|
|
|
|
для: Ivan
(26.12.2006 в 19:44)
| | Моготабличные запросы работают не быстро, но предложенный вариант ещё хуже :))) Строки всегда работают медленнее, чем целые значения, да и редактировать их сложно будет. | |
|
|
|
|
|
|
|
для: cheops
(26.12.2006 в 19:57)
| | Попробовал, должно работать.
Один нюанс еще. У меня выборка из родительской категории включает в себя также данные по подкатегориям. Получается в результате один объект забирается несколько раз. Добавил DISTINCT в запрос, наверно, еще притормозит..
SELECT DISTINCT objects.*
FROM objects, objects_clones
WHERE objects.id = objects_clones.obj_id
AND (
objects_clones.cat_id
IN ( 5, 6, 4, 3, 2 )
OR objects_clones.cat_id = '1'
)
|
Без DISTINCT не получится? | |
|
|
|
|
|
|
|
для: Ivan
(27.12.2006 в 02:49)
| | Используйте конструкцию GROUP BY для группировки объектов
SELECT DISTINCT objects.*
FROM objects, objects_clones
WHERE objects.id = objects_clones.obj_id
AND (
objects_clones.cat_id
IN ( 5, 6, 4, 3, 2 )
OR objects_clones.cat_id = '1'
)
GROUP BY objects.id
|
| |
|
|
|