Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Каталог - как включать подразделы в несколько разделов?
 
 автор: renat   (11.01.2009 в 16:58)   письмо автору
 
 

У меня есть такая проблема:

Есть каталог с разделами, а этих разделах есть подразделы. Как можно пофессионально сделать так чтобы некоторые подразделы можно было бы включать в несколько разделов?

Каталог у меня организованс с помощью mysql
Каждый раздел содержит: id, name
Каждый подраздел содержит: id, name, id_razdela

  Ответить  
 
 автор: DJ Paltus   (11.01.2009 в 17:07)   письмо автору
 
   для: renat   (11.01.2009 в 16:58)
 

Например, сделать id_razdela текстовым и в него писать через пробел/запятую/тире несколько id разделов, а при запросе проверять не равенство полей, а наличие вхождения нужной циферки.
Самое первое и самое простое, что приходит на ум. Наверное, оно же и будет самым правильным.

  Ответить  
 
 автор: Саня   (11.01.2009 в 17:12)   письмо автору
 
   для: DJ Paltus   (11.01.2009 в 17:07)
 

> ...а наличие вхождения нужной циферки
Странное решение — использовать текстовые поля для цифровых значений. При большом количестве разделов и запросов такое решение будет сильно лагать.

Самым правильным будет заведение отдельной таблицы типа
CREATE TABLE `links` (
  `id` INT UNSIGNED AUTO_INCREMENT PRMARY KEY,
  `section_id` INT UNSIGNED, # id раздела
  `parent_id` INT UNSIGNED DEFAULT 0 # id родительского раздела
) TYPE=MyISAM;

  Ответить  
 
 автор: DJ Paltus   (11.01.2009 в 17:25)   письмо автору
 
   для: Саня   (11.01.2009 в 17:12)
 

Ну так и что получается? Сначала мы запрашиваем список родительских id из таблицы links, получая в ответ массив, затем с этим списком строим запрос на выбор имен родительских разделов.
В моем случае, мы получаем список id родителей немного другим запросом к уже готовой таблице, получаем в ответ строку, которую точно так же используем для построения аналогичного запроса к той же таблице.
Принципиальная разница в чем? (Я не спорю, я прошу просветить, так как мне скоро тем же заниматься).

  Ответить  
 
 автор: Саня   (11.01.2009 в 18:57)   письмо автору
 
   для: DJ Paltus   (11.01.2009 в 17:25)
 

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

> Сначала мы запрашиваем список родительских id из таблицы links, получая в ответ
> массив, затем с этим списком строим запрос на выбор имен родительских разделов.
Про JOIN слышали?

Вот живой пример:
mysql> SELECT * FROM `sections`;
+----+-------+
| id | name  |
+----+-------+
|  1 | fst   |
|  2 | scnd  |
|  3 | thrd  |
|  4 | 1.1   |
|  5 | 1.2   |
|  6 | 1.3   |
|  7 | 2.1   |
|  8 | 3.1   |
|  9 | 1|2.1 |
| 10 | ololo |
+----+-------+
10 rows in set (0.00 sec)

mysql> SELECT * FROM `sec_links`;
+----+--------+-----------+
| id | sec_id | parent_id |
+----+--------+-----------+
|  1 |      4 |         1 |
|  2 |      5 |         1 |
|  3 |      6 |         1 |
|  4 |      7 |         2 |
|  5 |      8 |         3 |
|  6 |      9 |         1 |
|  7 |      9 |         2 |
|  8 |      9 |        10 |
+----+--------+-----------+
8 rows in set (0.00 sec)

mysql> SELECT `sec_links`.`parent_id` AS `id`, `sections`.`name` FROM `sec_links`
    -> LEFT JOIN `sections` ON `sec_links`.`parent_id`=`sections`.`id` WHERE `sec_id`=9;
+------+-------+
| id   | name  |
+------+-------+
|    1 | fst   |
|    2 | scnd  |
|   10 | ololo |
+------+-------+
3 rows in set (0.00 sec)

  Ответить  
 
 автор: DJ Paltus   (12.01.2009 в 09:58)   письмо автору
 
   для: Саня   (11.01.2009 в 18:57)
 

Теперь понял. Спасибо.

  Ответить  
 
 автор: Николай2357   (11.01.2009 в 19:05)   письмо автору
 
   для: DJ Paltus   (11.01.2009 в 17:25)
 

Принципиальная разница в том, что создатели MySQL настоятельно не рекомендуют пользоваться для связки строковыми значениями. И видно не спроста. К тому же организовать такую связку гораздо сложнее. Ведь на запрос 2 можно получить и 22 и 32 и 23 и222...

  Ответить  
 
 автор: Саня   (11.01.2009 в 19:09)   письмо автору
 
   для: Николай2357   (11.01.2009 в 19:05)
 

Смотря как организовать формат строки. Для формата "|id|id|id|" такой проблемы не будет (вместо "|" можно любой другой нецифровой разделитель). На такой строке достаточно сделать запрос SELECT ... LIKE "%|id|%"; Но это всё равно не решит проблему высокой трудоёмкости.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования