1

Тема: Дерево в mysql

Привіт усім!
Мені потрібно створити деревоподібну структуру таблиці в SQL. Хочу реалізувати категорії, підкатегорії і т.д на сайті, щоб при видаленні категорії видалялися всі підкатегорії. Як правильно побудувати цей запит, щоб створити таку таблицю?
Необхідні поля:
id
parrent_id
type - тип, категорія чи власне текст статті
title - заголовок
text - опис

Наперед дякую

2

Re: Дерево в mysql

Я би не зберігав інформацію про статті і категорії в одній таблиці а розділив би їх на 2 таблиці, також якщо одна стаття може мати більше чим одну категорію треба створити ще одну табличку такий звязок називається many to many. Це перший варіант який спав в голову, можливо є кращі.

Categories Table

CategoryID
CategoryName
CategoryDescription
ParentCategoryID
IsRootCategory


Posts Table

....
CategoryID
...


or

Post2Category

PostID
CategoryID

3

Re: Дерево в mysql

Те, що вам потрібно, називається "зовнішні ключі" або "foreign key". Для новачків це не проста тема, але головне правило при роботі із зовнішніми ключами: не створювати таблицю, поля якої посилаються на неіснуючу таблицю... хоча це я сходу згадав це правило, а там здається ще знайдете щось непросте...

А для того щоб видалялись поля в одній таблиці і автоматично це робилось в іншій, то дивіться у вашому редакторі SQL згадування про каскадність

4

Re: Дерево в mysql

ktretyak написав:

Те, що вам потрібно, називається "зовнішні ключі" або "foreign key". Для новачків це не проста тема, але головне правило при роботі із зовнішніми ключами: не створювати таблицю, поля якої посилаються на неіснуючу таблицю... хоча це я сходу згадав це правило, а там здається ще знайдете щось непросте...

А для того щоб видалялись поля в одній таблиці і автоматично це робилось в іншій, то дивіться у вашому редакторі SQL згадування про каскадність

та я колись таке робив, воно все в одній таблиці - видаляєш батьківський запис - видаляються всі дочірні. от тільки ніде не можу знайти це =(

5

Re: Дерево в mysql

Що ви маєте на увазі "видаляються дочірні елементи", якщо ви кажете що це все робиться в одній таблиці?

6

Re: Дерево в mysql

ktretyak написав:

Що ви маєте на увазі "видаляються дочірні елементи", якщо ви кажете що це все робиться в одній таблиці?

Наприклад, додаєш запис А, до нього дочірніми записи Б і В
при видаленні в таблиці запису А автоматично видаляються записи Б і В

7

Re: Дерево в mysql

я чомусь про видалення не замітив, ось тут народ якесь вирішення пропонує через трігер

https://social.msdn.microsoft.com/Forum … aproviders

8 Востаннє редагувалося ktretyak (19.01.2015 21:19:24)

Re: Дерево в mysql

savelikan написав:
ktretyak написав:

Що ви маєте на увазі "видаляються дочірні елементи", якщо ви кажете що це все робиться в одній таблиці?

Наприклад, додаєш запис А, до нього дочірніми записи Б і В
при видаленні в таблиці запису А автоматично видаляються записи Б і В

І така можливість є, її можна реалізувати за допомогою трігерів. Але вбудованого механізму, який робитиме це аналогічно до зовнішніх ключів, не існує (або я про нього нічого не знаю).

9

Re: Дерево в mysql

Аааа ось, знайшов!

CREATE TABLE IF NOT EXISTS `pages` (
  `pages_id` int(11) NOT NULL AUTO_INCREMENT,
  `pages_address` int(11) NULL,
  `pages_type` int(11) NOT NULL,
  `pages_user` int(11) NOT NULL,
  `pages_date` int(11) NOT NULL,
  `pages_update` int(11) NOT NULL,
  `pages_title` varchar(200) NOT NULL,
  `pages_text` text NOT NULL,
  PRIMARY KEY (`pages_id`),
  CONSTRAINT `fk_address` FOREIGN KEY `fk_address` (`pages_address`)
  REFERENCES `pages` (`pages_id`)
  ON DELETE CASCADE
) ENGINE=InnoDB;

10 Востаннє редагувалося ktretyak (19.01.2015 21:26:30)

Re: Дерево в mysql

  CONSTRAINT `fk_address` FOREIGN KEY `fk_address` (`pages_address`)
  REFERENCES `pages` (`pages_id`)
  ON DELETE CASCADE

Ну ось, це і є саме зовнішні ключі, які посилаються на зовнішню таблицю, та каскадне видалення.

Оновлено
Але схоже, що не на зовнішню таблицю, а саме на себе... Цікаво, і що воно працює?

11 Востаннє редагувалося savelikan (19.01.2015 21:27:58)

Re: Дерево в mysql

fk_address - де воно взялося тут? І для чого воно?

звичайно, що працює

12

Re: Дерево в mysql

Дійсно працює, прикольно. Ніколи такого не робив... трохи не звично, що залежні записи знаходяться в одній таблиці.

13

Re: Дерево в mysql

savelikan написав:

fk_address - де воно взялося тут? І для чого воно?

Це така назва зовнішнього ключа, яка потрібна для створення індексів (вони тут обов'язкові).

В цій таблиці при видаленні запису, наприклад, з pages_id = 1, видаляються всі записи, в яких pages_address = 1

14

Re: Дерево в mysql

Він має бути унікальний на всю базу даних, так?

15

Re: Дерево в mysql

savelikan написав:

Він має бути унікальний на всю базу даних, так?

Унікальним має бути значення в ключовому полі pages_id, а поле pages_address може мати безліч однакових ключів.

16

Re: Дерево в mysql

Я маю на увазі назва поля fk_address має бути унікальною для всіх таблиць в базі?

17

Re: Дерево в mysql

savelikan написав:

Я маю на увазі назва поля fk_address має бути унікальною для всіх таблиць в базі?

Так, оскільки це назва об'єкта, то всі об'єкти повинні мати унікальну назву.

18

Re: Дерево в mysql

А чи можна дізнатися ІД всіх записів, які були видалені?

19

Re: Дерево в mysql

savelikan написав:

А чи можна дізнатися ІД всіх записів, які були видалені?

Думаю, що ні. Хіба що при видаленні вам буде видано кількість оброблених рядків.

20

Re: Дерево в mysql

savelikan написав:

Привіт усім!
Мені потрібно створити деревоподібну структуру таблиці в SQL.

Замість  дурниць  про  триггери  та  інші  речі  які  не  мають  відношення  до  деревоподібних  структур  куримо   Nested Sets  або  Materialized Path.   
  Якщо  мова  про промисловий  сервер  БД  а  не  Mysql  то  там  як  правило  є  спеціалізовані оператори  типу WITH   тому  там  можна  користуватися  і  примітивними структурами таблиць   я к   у вашому  прикладі.