Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное" / 6 сообщений из 6, страница 1 из 1
19.02.2014, 13:28:40
    #38566005
pehser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное"
mahoune Древовидные структуры средствами MySQL

Все примеры будем рассматривать на каталоге товаров.

Способ 1 - самый простой
Самый простой способ организовать хранение дерева это создать таблицу каталога:

Поле ОписаниеID Уникальный номерParentID Номер родительского разделаCatName Название раздела

Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `Catalog` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `ParentID` INTEGER UNSIGNED NOT NULL,
  `CatName` VARCHAR(255) NOT NULL,
  PRIMARY KEY(`ID`)
);



В этой таблице поле ParentID указывает на родительский раздел, соответственно как-то надо обозначить тот раздел с которого начнется все дерево. Зачастую для этого используют значение 0 (ноль) в поле ParentID.

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

Поле ОписаниеID Уникальный номерCatID Номер разделаGoodName Название товара

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `Goods` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `CatID` INTEGER UNSIGNED NOT NULL,
  `GoodName` VARCHAR(255) NOT NULL,
  PRIMARY KEY(`ID`),
  CONSTRAINT `FK_Goods2Catalog` FOREIGN KEY `FK_Goods2Catalog` (`CatID`)
    REFERENCES `catalog` (`ID`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
);



Заметьте, мы сразу, при создании таблицы товаров, задаем связь между полем CatID таблицы товаров (Goods) и полем ID таблицы разделов (Catalog).

Теперь для выбора товаров из одного определенного раздела достаточно выполнить скрипт:
Код: sql
1.
2.
3.
SELECT g.*
FROM Goods g
WHERE CatID = 1;




три вопроса
1. почему в Catalog нет индекса для ParentID не уж то не нужно?
2. чем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `Goods` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `CatID` INTEGER UNSIGNED NOT NULL,
  `GoodName` VARCHAR(255) NOT NULL,
  PRIMARY KEY(`ID`),
  CONSTRAINT `FK_Goods2Catalog` FOREIGN KEY `FK_Goods2Catalog` (`CatID`)
    REFERENCES `catalog` (`ID`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
);


лучьше чем
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE `Goods` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `CatID` INTEGER UNSIGNED NOT NULL,
  `GoodName` VARCHAR(255) NOT NULL,
  PRIMARY KEY(`ID`), KEY `CatID` (`CatID`)
);



?

3. А если нужно выбрать категории в которых есть товары как правильно - оптимально сделать
у меня пока родилось такое решение:
Код: sql
1.
select C.* from Catalog as C join Goods as G on (C.ID=G.CatID) groyp by C.ID
...
Рейтинг: 0 / 0
19.02.2014, 13:44:06
    #38566043
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное"
pehser,

1) Индексы добавляются по мере возникновения в них необходимости.
2)
а) Не "лучьше", а "лучше"
б) Это вообще-то разные вещи: в одном случае задана связь, в другом просто проиндексировано поле; вы про внешние ключи вообще в курсе - что это такое и зачем оно нужно?
3) Только сами категории? если в родителе товаров нет, а в потомке есть - родителя (и всех его родителей) надо выводить? если да, то по-простому не получится, если нет, то вы в принципе написали почти то, что надо, хотя за "select * <...> group by OneColumn" на более суровых форумах расстреливают на месте. Хотя тут все поля из одной таблицы и группировка по её первичному ключу, это ещё куда ни шло :)
PS. 2miksoft: может, не будем засорять фак, а вынесем в отдельную тему?
...
Рейтинг: 0 / 0
19.02.2014, 14:18:06
    #38566132
pehser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное"
tanglirpehser,
б) вы про внешние ключи вообще в курсе - что это такое и зачем оно нужно?

Нет, только начал изучать работу с ключами
tanglir3) Только сами категории? если в родителе товаров нет, а в потомке есть - родителя (и всех его родителей) надо выводить?

Нет родителей не учитываем
tanglirто вы в принципе написали почти то, что надо

а ввчем НО - почти заключается
tanglirхотя за "select * <...> group by OneColumn" на более суровых форумах расстреливают на месте. Хотя тут все поля из одной таблицы и группировка по её первичному ключу, это ещё куда ни шло :)

А в чем проблема в "select * <...> group by OneColumn" почему расстреливают, а как нужно, а то жить хочется :) ?
...
Рейтинг: 0 / 0
19.02.2014, 14:59:38
    #38566245
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное"
tanglirPS. 2miksoft: может, не будем засорять фак, а вынесем в отдельную тему?Выделил. Благо что теперь функционал есть.
...
Рейтинг: 0 / 0
19.02.2014, 15:45:09
    #38566338
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное"
pehser 1. почему в Catalog нет индекса для ParentID не уж то не нужно?Вообще-то не индекс, а FK - не помешал бы, чтобы не допустить подвисших узлов, а так же случайное удаление узла, имеющего потомков:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `Catalog` (
  `ID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `ParentID` INTEGER UNSIGNED NOT NULL,
  `CatName` VARCHAR(255) NOT NULL,
  PRIMARY KEY(`ID`),
  FOREIGN KEY `FK_Catalog2Catalog` (`ParentID`)
    REFERENCES `Catalog` (`ID`)
    ON DELETE RESTRICT
    ON UPDATE RESTRICT
);
...
Рейтинг: 0 / 0
19.02.2014, 23:30:33
    #38566879
retvizan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное"
pehserА в чем проблема в "select * <...> group by OneColumn" почему расстреливают, а как нужно, а то жить хочется :) ?Посмотрите эту статью .
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вопрос по FAQ: Древовидные структуры средствами MySQL или роман Стендаля "Красное и Черное" / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]