рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - рдПрдХ рд╕реЗ рдХрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╕рдиреНрди рд╕реВрдЪреА рдФрд░ рднреМрддрд┐рдХ рдкрде рдХрд╛ рд╕рдВрдпреЛрдЬрди

MySQL рдореЗрдВ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдШрд┐рд╕рд╛-рдкрд┐рдЯрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдмрд╛рд░-рдмрд╛рд░ Habrt рдХреЛ рд╕реНрдореЛрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рдорд┐рд▓реА рдЬреЛ рд╕рдорд░реНрдерди рдФрд░ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдЦреБрдж ...

рдирд┐рдХрдЯрддрд╛ рд╕реВрдЪреА (AL) рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ:

рдирдореВрдирд╛ рд▓реЗрддреЗ рд╕рдордп рдореБрдЦреНрдп рдЕрд╕реБрд╡рд┐рдзрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ:

рд╡реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдпрд╛ рддреЛ рд╕реНрддрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрддреЗ рд╣реИрдВред рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмрджрд╕реВрд░рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рдм рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди!
рднреМрддрд┐рдХрд╡рд╛рджреА рдкрде рдореЗрдВ рдкреВрд░реНрдг рдкрде рдХреЛ рд╕рдВрдЪрдп рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдХрд╛рдлреА рд╕рдордЭ рдирд╣реАрдВ рдкрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рд╕реЗ рдХрдИ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ? рдХреЛрдИ рдХрд╣реЗрдЧрд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ " рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдерд╛ ", рд▓реЗрдХрд┐рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ: parent_id !
So. рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛:
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(10) unsigned DEFAULT NULL, `title` varchar(250) DEFAULT NULL, 


Pages_paths рддрд╛рд▓рд┐рдХрд╛:
 `item_id` int(10) unsigned DEFAULT NULL, `parent_id` int(10) unsigned DEFAULT NULL, `level` tinyint(3) unsigned DEFAULT '0', `order` tinyint(3) unsigned DEFAULT '0', 

рд╣рдо рдирд┐рд░реНрднрд░рддрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 ALTER TABLE `pages` ADD CONSTRAINT `pages_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE; ALTER TABLE `pages_paths` ADD CONSTRAINT `pages_paths_ibfk_2` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `pages_paths_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `pages` (`id`) ON DELETE CASCADE; 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдПрдПрд▓ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ "рд▓рдЯрдХрд╛" рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбрд╛рд▓реЗрдВ рдФрд░ рдкреЗрдбрд╝ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд AL рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рд╢рд╛рдЦрд╛ рдХреЗ рдореБрдЦреНрдп рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп, рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдкрде рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреВрд░реА рд╢рд╛рдЦрд╛ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИред
рдирдП рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдмреАрдЪ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдПрдХ рдЯреНрд░рд┐рдЧрд░ рд▓рдЯрдХрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд╕рд░рд▓ PHP рдореЗрдВ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЕрдкрдбреЗрдЯ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореИрдВрдиреЗ 1000 рдореЗрдЬреЛрдВ рдФрд░ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ 5 рд╕реНрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдЬ рдкрд░ рд╕рдм рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдкреАрдбрд╝рд╛ рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЗрдмрд▓ рд╣реИрдорд░ рд▓рд┐рдЦрд╛:
 Tree::Fixture( 'pages', 1000, 5 ); 

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдкрде рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 Tree::GeneratePaths('pages'); 

рдПрдХ рд╡рд┐рдХрд╛рд╕ рдорд╢реАрди рдкрд░ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ ~ 10 рд╕реЗрдХрдВрдб рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрде рдХреЗ рдкрде рдХреЛ рд╕рд░рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдкрде рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 SELECT * FROM `pages_paths` pp JOIN `pages` p ON p.`id`=pp.`parent_id` WHERE item_id=:id ORDER BY `order` 

рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ (рдпрд╛ рдЬреЛрдЗрди рдХреЗ рдмрд┐рдирд╛ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдиреЗрдВ):
 SELECT * FROM `pages_paths` pp JOIN `pages` p ON p.`id`=pp.`item_id` WHERE pp.`parent_id`=:id ORDER BY pp.`level`, pp.`order` 

рдпрджрд┐ рд╣рдо рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рд╣рдо рдЪрд▓рддреЗ рд╣реИрдВ, рддреЛ рдкрд╣рд▓реЗ рд╣рдо рдкрдереЛрдВ рдХреА рдкреБрд░рд╛рдиреА рд╢рд╛рдЦрд╛ рдХреЛ рдзрдорд╛рдХрд╛ рдХрд░рддреЗ рд╣реИрдВ (item_id =: id OR parent_id =: id) рдФрд░ рдирдП рдЕрджреНрдпрддрдиреЛрдВ рдореЗрдВ рдкрде:
 Tree::GeneratePaths( 'pages', $id ); 

100-200 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╢рд╛рдЦрд╛ рдХреЗ рднреАрддрд░ рдЕрдкрдбреЗрдЯ 1 рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рдлрд┐рдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ - рдХреЗрд╡рд▓ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рд╣реА рджреЗрд░реА рджреЗрдЦреЗрдВрдЧреЗред
PHP рдХреНрд▓рд╛рд╕ рдФрд░ рдХреЛрд░ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд╛ рдкреВрд░рд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВред
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг ( рдпрд╛ рдкреВрд░реЗ ):
 //   $arr = Tree::GetPath( 'pages', $id ); //   $arr = Tree::GetChildren( 'pages', $id ); //  $num = Tree::GetChildrenCount( 'pages', $id ); 


рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА рдЕрдЧрд░ рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреНрд░рдордг рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдХреИрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдПрдХ MySQL рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдпрд╛ рдЕрдиреНрдп рдЪрддреБрд░ рд╡рд┐рдЪрд╛рд░ред

Source: https://habr.com/ru/post/In138947/


All Articles