SSSerj
Новичок
Nesteв Sets и связь с модулями
Хотелось бы организовать структуру в соответствии алгоритмом вложенных множеств по следующей схеме: структура (categories) и данные (data) имеют связь 1-М.
Данная схема целесообразна при условии, что сайт – это совокупность статей (текст+картинки). В общем случае, сайт может иметь различные структуры данных типа НОВОСТИ, ФОТОГАЛЛЕРЕЯ и т.п.
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 )
Отсюда получаем
L=CL,
R=CR,
module_name=MN,
level=LV
2) По этим параметрам определяем цепочку навигации
2.1)
Получаем массив ARR1 параметров узлов
3) Определяем, чем является cid=N: является ли он разделом, имеющим в качестве детей подразделы (случай 3.1), или (под)разделом, имеющим листья (случай 3.2), либо вообще листком (3.3)
Смотрим детей
Анализируем детей:
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
В нашем случае, для 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
Где I,J – значения полей cid узлов (5,6), родитель которых является cid=N (cid=2)
3.3) N – лист
1**) К названию модуля можно привязать и что-нибудь другое…, к примеру, блоки рекламы. Хотя здесь можно «проиграться», либо привязать только к названию модуля (categories.module_name), либо к categories.module_name и categories.cid
2**) Поле title, определенное в categories, будет нести множественный логический смысл, оно либо название новости, либо название фотоальбома, либо название статьи…и т.п.
Хотелось бы организовать структуру в соответствии алгоритмом вложенных множеств по следующей схеме: структура (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
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….}]
Получаем данные. Зная название модуля (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 … ]
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, будет нести множественный логический смысл, оно либо название новости, либо название фотоальбома, либо название статьи…и т.п.