Nesteв Sets и связь с модулями

SSSerj

Новичок
Nesteв Sets и связь с модулями

Хотелось бы организовать структуру в соответствии алгоритмом вложенных множеств по следующей схеме: структура (categories) и данные (data) имеют связь 1-М.
PHP:
CREATE TABLE categories (
cat_id      //INT UNSIGNED NOT NULL AUTO_INCREMENT,
cat_left    //INT UNSIGNED NOT NULL,
cat_right    //INT UNSIGNED NOT NULL,
cat_level    I//NT UNSIGNED NOT NULL,
PRIMARY KEY(cat_id),
KEY(cat_left, cat_right, cat_level)
);

CREATE TABLE data (
data_id       //INT UNSIGNED NOT NULL AUTO_INCREMENT,
cat_id       //INT UNSIGNED NOT NULL,
descr	    //TEXT
PRIMARY KEY(data_id),
KEY(cat_id)
// );
Данная схема целесообразна при условии, что сайт – это совокупность статей (текст+картинки). В общем случае, сайт может иметь различные структуры данных типа НОВОСТИ, ФОТОГАЛЛЕРЕЯ и т.п.

1) Посоветуйте, как организовать модель БД (Mysql), учитывая различные структуры данных (различные сущности)?
2) Как связать эти сущности с таблицей categories?

-~{}~ 01.09.04 18:09:

И все же ответов не было...
Для полноты вопроса, приведу модель, которую я хочу "положить в nested sets". Может быть, найдутся советы и предложения http://www.kosmik.ru/er/er.png

-~{}~ 02.09.04 14:41:

Родились идеи ,требующие ваших комментариев.

Er- модель http://www.kosmik.ru/er/er2.png (рисунок 1)
Пример http://www.kosmik.ru/er/example.gif (извините «за кривой рисунок», рисунок 2)

См. ниже

К примеру такой запрос
http://.../index.php?module=news&cid=N

1) Определения параметров узла (cid, module_name, L,R, level)
1.1 )
PHP:
SELECT * FROM categories WHERE cid=N
Отсюда получаем
L=CL,
R=CR,
module_name=MN,
level=LV

2) По этим параметрам определяем цепочку навигации
2.1)
PHP:
SELECT categories.title, categories.cid, categories.module_name
FROM  categories 
WHERE 	categories.L<CL and
		categories.R>CR
ORDER by categories.L
Получаем массив ARR1 параметров узлов

3) Определяем, чем является cid=N: является ли он разделом, имеющим в качестве детей подразделы (случай 3.1), или (под)разделом, имеющим листья (случай 3.2), либо вообще листком (3.3)

Смотрим детей
PHP:
	SELECT * FROM categories WHERE L  BETWEEN CL and CR and level =LV+1
Анализируем детей:
L-R=1 --- множество листков (случай 3.1)
L-R!=1 --- множество подразделов (случай 3.2)
…. ---- это 1 лист, параметры которого нам известны см.п.1 (случай 3.3)

Здесь получаем массив объектов ARR2, который будет содержать параметры выбранных узлов.

Надо заметить, что последующая логика может определяться по разному. Логика будет определяться видом деятельности компании, для которой пишем сайт...J

3.1) Множество листков К примеру, НОВОСТИ СПОРТА, cid =5 (L=3, R=10, Level=2) – см. рисунок 2
PHP:
SELECT * 
FROM  MN, categories 
WHERE   [categories.cid=MN.cid  and {categories.cid=(MN.cid i-ого узла ) or categories.cid=(MN.cid j-ого узла ) or….}]
В нашем случае, для cid=5, получаем MN.cid i-ого узла = 11, MN.cid i-ого узла = 12, MN.cid K-ого узла = 13

Получаем данные. Зная название модуля (module=news) мы определяем шаблон для представления (к примеру, $_SERVER[‘module’].html)…, располагая данными, полученными из запроса, парсим шаблон. …

3.2) Множество (под)разделов :: К примеру, НОВОСТИ, cid =2 (L=2, R=19, Level=1) – см. рисунок 2

Выводить описание (под)раздела, взяв данные из таблицы noname
Формируем запрос исходя из данных ARR2
PHP:
SELECT * FROM noname, categories WHERE [categories.cid = noname.cid and (noname.cid = i) or (noname.cid = j) or … ]
Где I,J – значения полей cid узлов (5,6), родитель которых является cid=N (cid=2)

3.3) N – лист
PHP:
SELECT * 
FROM  MN, categories 
WHERE 	categories.cid=MN.cid and 
MN.cid=$_SERVER['cid']


1**) К названию модуля можно привязать и что-нибудь другое…, к примеру, блоки рекламы. Хотя здесь можно «проиграться», либо привязать только к названию модуля (categories.module_name), либо к categories.module_name и categories.cid

2**) Поле title, определенное в categories, будет нести множественный логический смысл, оно либо название новости, либо название фотоальбома, либо название статьи…и т.п.
 
Сверху