Forums / National / Russian / Вопрос по проектированию БД

Решении вопроса мультикатегорийно

Asmo
#2960 2009-01-05 04:37
Делаю тут каталог, возник ряд вопросов по проектированию БД.
Как известно, в СЕ страницу можно привязать только к одной категории, видел я на seditioforge костыль для решения мультикатегорийности, но коль уж делать решил все с нуля, то и хотелось бы сразу уже правильно.

мне нужно сделать так, чтобы одну страницу можно было добавлять в три разных категории, в идеале в N категорий, где N - кол-во категорий, ограничиваемое в настройках.
Варианты:
1) Отдельно таблица для связей категорий и страниц.
2) Как в костыле с seditioforge - в странице в поле page_cat записывать коды категорий через запятую, а потом при построении списков выбирать через
WHERE page_cat LIKE '%$c%'
3) Сделать три отдельных поля в странице: page_cat1, page_cat2, page_cat3 и выбирать соответсвенно -
WHERE (page_cat1='$c' OR page_cat2='$c' OR page_cat3='$c')
В общем не гибко, сколько полей столько и категорий всего.
Но если разобраться то все равно ограничитель этот будет выставляться один раз, например максимум 3 категории на страницу, а там уже на выбор - хочешь одну, хочешь три. Так что собственно это требование не критичное.

Вот хочу испросить совета как лучше это сделать.
Страниц будет очень много, ибо это каталог будет.
Я остановился на третьем варианте, идея с LIKE и второй таблицей мне не очень нравится из-за моей паранойи по поводу производительности.

Интересует, какой из вариантов, на ваш взгляд, предпочтительнее с оглядкой на производительность, нагрузку на БД.

Что скажут профессиональные прогеры я в общем то догадываюсь :) это 1 вариант, мне уже открыли глаза на "Нормализацию баз данных", хоть я и добросовестно прочел об этом все по ссылке на вики, но не уловил связи с моим случаем, из 5 примеров указывающих на необходимость нормализации, ни один не подходит.

Собственно этот вопрос возникал у меня и раньше, все не устраивало что в СЕ нет мультикатегорийности как в вордпресс, но какой монстр вордпресс и какой шустрый СЕ, на том и стоим ведь :)