Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > выбор всех сущностей из заданных нод дерева


Автор: 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.
Ну а потом просто:
Код
select * from something 
  where something_id in (select something_id from something_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
ОК, спасибо. Так и сделаю.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)