Принадлежность категории/категориям (теоретический)

LittleDen

Новичок
Принадлежность категории/категориям (теоретический)

Есть у меня автомобильный сайт (Транспорт Красноярска, если кому интересно). Сам сайт крутится на Mambo. Многое в этом движке меня устраивает, и столько же -- нет.

Хочу расширить функционал работы со статьями. То есть, прокатегоризировать их (например, "драйв-тест", "автомузыка", "автоправо" и так далее, с целью заведения целевых разделов на сайте). На данном этапе мне видится два варианта решения задачи:

1. Ключевые слова (ака "названия категорий") вписывать в мета-теги для статьи. Они хранятся в базе вместе со статьёй, но используются только для последующей вставки в HTML. Можно подправить код движка, чтобы при соответствующем запросе учитывались и поля мета-тегов.

2. В таблице с контентом заводится ещё одно поле для указания собственно категории/категорий, которым соответствует статья. И вот тут, собственно, и кроется задача. Сталкиваюсь с таким первый раз, поэтому чрезвычайно интересно послушать мнение опытного народа. Навскидку видится опять же два варианта:

2.1) Бинарное поле, в котором каждый включенный бит означает соответствие той или иной категории (таблица соответствия битов/категорий может храниться хоть в текстовом файле, это непринципиально). Преимущество такого подхода в том, что поиск можно производить с помощью логических побитовых операций. Из недостатков видится тот момент, что при большом количестве категорий размер этого бинарного поля будет некислым.

2.2) Поле типа ENUM/SET, в котором через запятую будут указаны числа, соответствующие номерам категорий. Из недостатков видится некоторая сложность работы с подобным типом поля.

А как народ в своих проектах реализует подобное?
 

DiTHER

bang bang
создается две таблицы
1. таблица статей (articles)

id int primary key
content text
id_category int

2. таблица категорий (categories)
id int primary key
title text/varchar

поле id_category в таблице статей связывается с полем id в таблице категорий. Т.е. таблицы связываются между собой.

Доставать данные оттуда можно таким макаром :)
[sql]
select articles.content, categories.title from articles left join categories on articles.id_category = categories.id where articles.id = 2[/sql]

и так далее в таком духе.. :)
 

DiTHER

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

-~{}~ 26.09.05 10:20:

промежуточная таблица, например:

id int primary
id_article int
id_category int

т.е.
id_category в таблице статей указывает на _несоклько_ записей в промежуточной таблице, в которой поле id_category указывает уже непосредственно на нужную категорию
 

LittleDen

Новичок
Поэтому я и рассматриваю вариант 2.1 -- там всё можно сделать одним запросом (правда, предварительно сформировать битовую маску для нужного мне сочетания категорий).

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

DiTHER

bang bang
что тут элегантнее ты уж сам решай :), но битовые маски тут использовать, ИМХО, не совсем элегантно :)
 

LittleDen

Новичок
Мне интересно, как другие решают задачу определения принадлежности категории/категориям. ;) Битовая маска -- самое простое, что мне пришло на ум. Но как только появляются ПОДкатегории (произвольного уровня вложенности) -- этот способ перестаёт работать.
 

DiTHER

bang bang
Ну по крайней мере как делаю я и моя группа разработчиков - ты уже знаешь :) Наращивать связанные таблицы после этого - совсем не сложно (к вопросу создания подкатегорий)
 

ForJest

- свежая кровь
LittleDen
Решать это нужно через промежуточную таблицу.
Только формат таблицы
[sql]
CREATE TABLE `wp_lnk_html_page_category` (
`id_html_page` int(11) NOT NULL default '0',
`id_category` int(11) NOT NULL default '0',
PRIMARY KEY (`id_html_page`,`id_category`)
) TYPE=MyISAM;
[/sql]
для таблицы-связки не нужен собственный id
 

LittleDen

Новичок
ForJest
То есть в дополнительном поле к статье мы указываем некий идентификатор, на который в итоге ссылаемся через wp_lnk_html_page_category.id_html_page?
 

LittleDen

Новичок
Andreika
Именно категоризации -- нет. То, что называется там categories -- жалкая пародия на то, что я реально хочу.
 

buzzer

Новичок
По битовым маскам, как ты хочешь, имхо, совсем не правильно. Ну например , что ты будешь делать при добавлении новой категории? Добавлять каждой статье еще один бит категории? По моему не очень красиво...
Я бы сделал это заведением дополнительной промежуточной таблицы с индексами категорий и статей.
 

LittleDen

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

Использование промежуточной таблицы меня смущает тем, что статьи, имеющие одинаковый набор категорий, в поле что-нибудь вроде categories_set будут иметь разное число (в отличие от битовой маски, кстати). Можно, конечно, "забить" на это, но "как-то неаккуратненько". :)

Может, я многого хочу? :)
 

buzzer

Новичок
LittleDen
Конечно такое решение (по битовым маскам) тоже возможно... Возможно оно будет даже быстрее, т.к. нужно будет считывать только одно поле...
Что то я не совсем понял что тебя смущает в варианте который приедставили я и другие участники (ForJest , DiTHER
). Каждая запись в доп таблице будет соответствывать связи между статьей и категорией. Этот способ прост для понимания (по крайней мере моего). Я не настаиваю на этом решении, но выбирать тебе... респект :)
 

LittleDen

Новичок
buzzer
На самом деле ничего не смущает. Просто пытаюсь найти побольше хороших вариантов. Ну и заодно найти недостатки в предложенных методах. В споре ведь истина рождается. :)
 
Сверху