[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Привязка нескольких категорий
asdf27
Задача следующая:

Есть категории (К), в них несколько подкатегорий (Пк), которые выбираются чекбоксами. К "фирме" могут быть привязаны несколько кат. и подКат. На сайте, при выборе подкатегории, выводятся все связанные фирмы (как теги).

Как вижу реализацию:

К таблице фирмы добавляю два поля, cat и sub. В них через разделитель прописываются id'шники. При выводе подкатегории имею запрос вида


$res1=mysql_query("SELECT `cat` FROM firms");
while ($row1=mysql_fetch_assoc($res1)) {
$new = explode(";", $row1[cat]);
for ($i=0; $i < $size; $i++) {
if ($new[i]==$_GET[cat]) {
//такой же запрос к подкатегори
}
}
}



Смущает два момента:

1. код большой
2. Когда фирм будет ~ 1000 и трафик ~ 1000, сервак наверно загнется.

Что скажете?



Спустя 1 час, 14 минут, 42 секунды (28.09.2012 - 02:08) neadekvat написал(а):
Хорошо, что возникли сомнения.

Существует понятие "нормальных форм". На досуге советую почитать, что это за зверь такой, сколько их существует и сколько из них соблюдать обязательно.

А пока что по сути вопроса. Мы имеем две сущности: компании и категории. И связаны эти сущности отношением "многие ко многим". То есть компания может относится к нескольким категориям, а категории, в свою очередь, могут включать в себя несколько компаний.
Предметно это будет две таблицы: компаний и категорий. Для создания связей "многие ко многим" там без вариантов придется создавать третью таблицу с двумя полями, где мы будем хранить пары ключей (надеюсь, id):
coms_cats
campany_id | category_id

Соответственно, при выводе категории делаем нечто такое:
SELECT t1.*
FROM `companies` t1
INNER JOIN `coms_cats` t2 ON t1.campany_id = t2.campany_id
WHERE t2.`category_id` = $cat_id

Спустя 13 минут, 15 секунд (28.09.2012 - 02:22) asdf27 написал(а):
Про сущности читал давно, нужно освежить.

Хорошо, спасибо, с этим понятно. Тогда встает вопрос обновления: если юзверь снимет пару чекбоксов (т.е. сократит подкатегории), верным ли будет удалить все записи из coms_cats с id фирмы и снова вписать новые категории? Тут вопрос нагрузки уже не стоит.

Спустя 32 минуты, 17 секунд (28.09.2012 - 02:54) neadekvat написал(а):
Не очень понял вопрос.

Смотри, есть у нас компании с id = 1 и с id = 2, и есть категории с id = {1..5}
Допустим, категории расставили как-то так (новая строка - отдельная запись):
com_id | cat_id
1 | 2
1 | 4
2 | 1
2 | 4

И теперь юзер удаляет у компании с id = 2 категорию с id = 4. Удаляется, соответственно, только одна строка:
1 | 2
1 | 4
2 | 1
2 | 4

По запросу "... WHERE com_id = 1 AND cat_id = 4" Будет быстро даже под нагрузкой.

Спустя 57 минут, 25 секунд (28.09.2012 - 03:51) asdf27 написал(а):
Тогда возникает морока с отлавливанием снятого чекбокса (сюда крутить JS). На каждую контору порядка 15 категорий, суммарно их (строк фирма|кат) будет менее 20к. Редкое редактирование позволяет сделать именно удаление всех и новая запись.

Вобщем, спасибо, уже плюсанул smile.gif

Спустя 57 минут, 22 секунды (28.09.2012 - 04:49) neadekvat написал(а):
А, понял, о чем речь.
В общем, есть вариант и без удаления всех записей. В скрытых полях около каждого чекбокса выводится его состояние на момент до редактирования, в зависимости от этого поля будет понятно, есть ли необходимость делать что-то с бд из-за этого конкретного чекбокса.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.