|
|
|
| У меня есть такая проблема:
Есть каталог с разделами, а этих разделах есть подразделы. Как можно пофессионально сделать так чтобы некоторые подразделы можно было бы включать в несколько разделов?
Каталог у меня организованс с помощью mysql
Каждый раздел содержит: id, name
Каждый подраздел содержит: id, name, id_razdela | |
|
|
|
|
|
|
|
для: renat
(11.01.2009 в 16:58)
| | Например, сделать id_razdela текстовым и в него писать через пробел/запятую/тире несколько id разделов, а при запросе проверять не равенство полей, а наличие вхождения нужной циферки.
Самое первое и самое простое, что приходит на ум. Наверное, оно же и будет самым правильным. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: Саня
(11.01.2009 в 17:12)
| | Ну так и что получается? Сначала мы запрашиваем список родительских id из таблицы links, получая в ответ массив, затем с этим списком строим запрос на выбор имен родительских разделов.
В моем случае, мы получаем список id родителей немного другим запросом к уже готовой таблице, получаем в ответ строку, которую точно так же используем для построения аналогичного запроса к той же таблице.
Принципиальная разница в чем? (Я не спорю, я прошу просветить, так как мне скоро тем же заниматься). | |
|
|
|
|
|
|
|
для: 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)
|
| |
|
|
|
|
|
|
|
для: Саня
(11.01.2009 в 18:57)
| | Теперь понял. Спасибо. | |
|
|
|
|
|
|
|
для: DJ Paltus
(11.01.2009 в 17:25)
| | Принципиальная разница в том, что создатели MySQL настоятельно не рекомендуют пользоваться для связки строковыми значениями. И видно не спроста. К тому же организовать такую связку гораздо сложнее. Ведь на запрос 2 можно получить и 22 и 32 и 23 и222... | |
|
|
|
|
|
|
|
для: Николай2357
(11.01.2009 в 19:05)
| | Смотря как организовать формат строки. Для формата "|id|id|id|" такой проблемы не будет (вместо "|" можно любой другой нецифровой разделитель). На такой строке достаточно сделать запрос SELECT ... LIKE "%|id|%"; Но это всё равно не решит проблему высокой трудоёмкости. | |
|
|
|