Нужен совет по sql

Статус
В этой теме нельзя размещать новые ответы.

асс

Мой дом здесь!
Регистрация
13 Окт 2006
Сообщения
762
Реакции
230
Добрый деню
Скажите пожалуйста как реализовать базу данных с подкатегориями.

Например есть категория razdel
мне надо
сделать в базе в разделе 2 категории
пример
razdel > kategory > podkategory


раздел категория подкатегория
Книги> Автомобили> Отечественные

У меня етсь таблица отдельно в базе данных
в ней щас есть только раздел.

Как добавить к нему категорию?
Создавтаь еще 2 таблицы?

Если можно объясните пожалуйста.
Спасибо.
 
обычно делают так:
на каждый признак - отдельный словарь
т.е. три отдельный таблицы: раздел - категория - подкатегория
в словарях меньшего уровня должно быть поле для связи с вышестоящим словарем по коду например

таблица разделы
кодраздела наименование

таблица категории
кодраздела кодкатегории наименование

таблица подкатегории
кодраздела кодкатегории кодподкатегории наименование

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

таблица разделы
кодраздела наименование

таблица категории
кодраздела кодкатегории наименование

таблица подкатегории
кодраздела кодкатегории кодподкатегории наименование

таким образом легко будут составляться любые выборки

Я так и сделал
создал 3 таблицы
cat
podrazdel
razdel

и все их объеденил. Теперь осталось только разобраться как в каждую заносить свое значение.
Потому как один запрос у меня что то не выходит.

Придеться наверное делать три запроса, может есть возможность оним запросом загнать?

Мне кажеться что можно загнать так же как я вбрал их
из базы

вот так

$Q1 = mysql_query("SELECT * FROM cat, razdel,podrazdel WHERE id ");
далее по названию ячейки выбрать
или добавить значения
и все


echo " категория ".$r['title'];
echo " раздел ".$r['razd_title'];
echo " под раздел ".$r['pod_title'];

хотя наверное не выйдет.
 
Смысл в разных таблицах?
А если уровень вложенности 4 или 5 или 10?
Хранить всё в одной таблице. Вязать через parent id в ней же или через отдельную таблицу связей.
 
Смысл в разных таблицах?
А если уровень вложенности 4 или 5 или 10?
Хранить всё в одной таблице. Вязать через parent id в ней же или через отдельную таблицу связей.

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

хранить все в одной таблице вариант как раз гораздо более запутанный, не надо изобретать велосипед

Придеться наверное делать три запроса, может есть возможность оним запросом загнать?

а поподробнее: что нужно в итоге получить?
 
Читаем про списки смежности, вместо того чтобы умничать.
 
Читаем про списки смежности, вместо того чтобы умничать.

Я сделал таблицу и добавил туда поля.
К тому же я думаю что вложение на 10 значений это маловероятно.
Максимум 4 уровня,
Я сделал 3 уровня добавил основное поле и два дополнительных, во всяком случае мне так легче.
 
tirrex, у каждой записи категории, даже с названием "охренительнодлиннаямлинкатегория", есть свой уникальный идентификатор id и идентификатор родителя, категории на уровень выше(как предложил PHP_Master parent_id), т.е. в данном случае у категории "podkategory" parent_id будет равен id "kategory", у "kategory" parent_id=id "razdel", а у "razdel" parent_id равен 0 либо NULL. Таким способом можно реализовать бесконечное вложенное количество подкатегорий и все это размещается в одной таблице. Так устроены разделы, подразделы и темы в большинстве(если не во всех) форумах, в т.ч. vBulletin, который расположен на nulled.ws
 
tirrex, у каждой записи категории, даже с названием "охренительнодлиннаямлинкатегория", есть свой уникальный идентификатор id и идентификатор родителя, категории на уровень выше(как предложил PHP_Master parent_id), т.е. в данном случае у категории "podkategory" parent_id будет равен id "kategory", у "kategory" parent_id=id "razdel", а у "razdel" parent_id равен 0 либо NULL. Таким способом можно реализовать бесконечное вложенное количество подкатегорий и все это размещается в одной таблице. Так устроены разделы, подразделы и темы в большинстве(если не во всех) форумах, в т.ч. vBulletin, который расположен на nulled.ws


Если не сложно продемонстрируйте примерчик, как сделать все в одной таблице.Хотябы на 2 уровня вложения.


Вот у меня
таблицы

Основная категория
CREATE TABLE `cat` (
`id` int(9) NOT NULL auto_increment,
`cpu` varchar(125) NOT NULL,
`title` varchar(125) NOT NULL,
`razd_id` int(9) default NULL,
UNIQUE KEY `title` (`title`),
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
INSERT INTO `cat` VALUES (1, 'knigi', 'Книги', 1);


В категории Автомобили книги есть много подкатегорий
CREATE TABLE `razdel` (
`razd_id` int(9) NOT NULL auto_increment,
`razd_cpu` varchar(25) NOT NULL,
`razd_title` varchar(25) NOT NULL,
`pod_id` int(9) NOT NULL,
KEY `razd_id` (`razd_id`)
) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=30 ;
INSERT INTO `razdel` VALUES (1, 'avtomobili', 'Автомобили', 1);
INSERT INTO `razdel` VALUES (2, 'bestsellery', 'Бестселлеры', 1);
INSERT INTO `razdel` VALUES (3, 'delovaya_literatura', 'Деловая литература', 1);

Ну еще можно добавить подразел это уже 3 уровень
CREATE TABLE `podrazdel` (
`pod_id` int(9) NOT NULL auto_increment,
`pod_cpu` varchar(25) NOT NULL,
`pod_title` varchar(25) NOT NULL,
KEY `pod_id` (`pod_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
 
что-то вроде:
PHP:
CREATE TABLE `cat` (
`id` INT NULL AUTO_INCREMENT PRIMARY KEY ,
`parent_id` INT NOT NULL ,
`cpu` VARCHAR( 125 ) NOT NULL ,
`title` VARCHAR( 125 ) NOT NULL 
) TYPE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_general_ci;
данные:
PHP:
-- 1-ый уровень
INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '0', 'knigi', 'Книги'
);
-- 1-ый уровень закончился
-- 2-ой уровень
INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '1', 'avtomobili', 'Автомобили'
);

INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '1', 'bestsellery', 'Бестселлеры'
);

INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '1', 'delovaya_literatura', 'Деловая литература'
);
-- 2-ой уровень закончился
-- 3-ий уровень
INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '2', 'vaz', 'Ваз'
);

INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '2', 'uaz', 'Уаз'
);

INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
VALUES (
NULL , '2', 'gaz', 'Газ'
);
-- 3-ий уровень закончился
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху