| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > выбор всех сущностей из заданных нод дерева |
| Автор: dm9 13.7.2006, 17:08 |
| Вопрос, мне кажется, из разряда классических... Есть что-то (назовём это something), что привязывается к нодам каталога по принципу многие - ко многим. Есть каталог. Есть список нод каталога (таблица). Требуется вытащить все экземпляры something (без повторения), которые лежат в данных нодах каталога. Пусть объявления таблиц такие: table something - something_id (INT) - something_data (VARCHAR, INT or smth. else) table node - node_id (INT) - node_data (VARCHAR, INT or smth. else) table ref (связь многие ко многим) - id (INT) - node_id (INT) - something_id (INT) table node_list (список нод, из которых надо сделать выборку) - node_id (INT) Вопрос не в том, как это сделать, а в том, как это сделать быстрее... потому что данных много. Реализовываться будет на MySQL 4.1.x >= 4.1.9, но поместил вопрос сюда... мне кажется, он общий. Если не прав — перемещайте. |
| Автор: LSD 13.7.2006, 22:17 | ||
| 1. Из table ref можно удалить поле id и оставить, только node_id и something_id сделав первичный ключ по двум полям, но это так мелочи. 2. Создать еще одну таблицу: table something_list в которой держать список something_id которые надо выбрать. Заполнять эту таблицу на основе table ref и table node_list с помощью триггеров на table ref и table node_list. Ну а потом просто:
|
| Автор: dm9 14.7.2006, 13:01 |
| То есть создавать что-то типа кэша, чтобы потом напрямую забирать результаты... Наверное, стоит чуть подробнее описать задачу. У меня есть каталог, и при переходе в ноду, содержащую потомков, я должен выдать всё содержимое её потомков (потомки, правда, могут быть только одного уровня). Значит, я создам таблицу (node_id, something_id), которая будет содержать список всех элементов для каждого выбора пользователя (то есть на входе будет не таблица, содержащая node_id, а только один id, по которому я выберу something_id). |
| Автор: LSD 14.7.2006, 14:55 |
| Ну вообщем, нечто подобное я и предлагал. Т.е. создаем еще одну таблицу связей ref_full, в ней будут храниться связи node со всеми своими something-гами, и плюс связи с something-гами потомков, если таковые имеются. ref_full - заполнять триггерами, а пользователям дать возможность редактировать только ref. Тогда при выборе нужного нода, ты делаешь select из ref_full, где соответсвующий id, а затем join-иш something-ги. |
| Автор: dm9 14.7.2006, 15:35 |
| ОК, спасибо. Так и сделаю. |