Вопрос № 77983: Вопрос относительно лудьшего варианта:
Нужно создать таблицу с каталогами и подкаталогами.
Как лучьше зделать:
1. Одна таблица с тремя полями: id раздела, к какому разделу относится, название раздела;
2. Две таблицы: Первая: id раздел...Вопрос № 78002: Какой из запросов более быстрее происходит:
Select * from table1 WHERE id IN (SELECT par_id FROM table2)
ИЛИ
Select table.* from table1,table2 WHERE table1.id=table2.par_id...
Вопрос № 77.983
Вопрос относительно лудьшего варианта:
Нужно создать таблицу с каталогами и подкаталогами.
Как лучьше зделать:
1. Одна таблица с тремя полями: id раздела, к какому разделу относится, название раздела;
2. Две таблицы: Первая: id раздела, название раздела; Вторая: id подраздела, к какому разделу относится, название подраздела?
Отвечает: Архангельский Андрей Германович
Здравствуйте, Райкин Сергей Александрович!
Реально легче построить в одной таблице дерево, и дальше работать с ним как с деревом или как с 2-3 списками.
Сейчас пишу книгу по древовидным, могу высласть первую часть с простыми деревьями
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 12.03.2007, 17:21 Оценка за ответ: 5 Комментарий оценки: Спасибо за комментарий. Если можете высылайте, почитаю.
Отвечает: Ерёмин Андрей
Здравствуйте, Райкин Сергей Александрович!
На мой взгляд, рациональнее хранить всё в одной таблице. Просто "корневые" разделы, т.е. те, которые никому не принадлежат, будут иметь parent_id = 0. Одну таблицу и обрабатывать проще и быстрее, даже и памяти она меньше занимает, ведь при наличии второй таблицы поле id_раздела будет хранится дважды. При построении дерева из такой таблицы нужно применить рекурсию, т.е. сначала читаются базовые разделы, затем для каждого базового читаются его подразделы, для каждого подраздела читаются подразделы второго
порядка и т.д.
--------- Нет правила без исключений. Правило без исключений - исключение из правил.
Отвечает: Илья Андреевич
Здравствуйте, Райкин Сергей Александрович!
Вообще не так.
в первой таблице надо хранить айди и названия, а во второй их структуру вида: id_cat, id_subcat.
все нормальные люди делают так :) самый оптимальный вариант
Ответ отправил: Илья Андреевич (статус: Студент)
Ответ отправлен: 12.03.2007, 21:22 Оценка за ответ: 5 Комментарий оценки: Да. Я даже про это не подумал, действительно вместо второго варианта надо поставить этот!!!
Отвечает: DragonTusk
Здравствуйте, Райкин Сергей Александрович!
Отношение находится в третьей нормальной форме (3НФ), если оно находится во второй нормальной форме, и не одно из ее не ключевых полей не зависит функционально от любого другого не ключевого поля.
id раздела->название раздела
название раздела->название подраздела
Т.о. второй вариант правильный.
Ответ отправил: DragonTusk (статус: 3-ий класс)
Ответ отправлен: 12.03.2007, 23:33 Оценка за ответ: 4 Комментарий оценки: Да. Но предыдущие эксперт предложил второй вариант, с небольшими изменениями, которые намного лучше второго варианта.
Вопрос № 78.002
Какой из запросов более быстрее происходит:
Select * from table1 WHERE id IN (SELECT par_id FROM table2)
ИЛИ
Select table.* from table1,table2 WHERE table1.id=table2.par_id
Отвечает: Архангельский Андрей Германович
Здравствуйте, Загиров Рустам!
Однозначно второй запрос выполняется быстрее, часто в разы
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 12.03.2007, 19:19 Оценка за ответ: 5 Комментарий оценки: ок, спасибо, буду знать теперь
Отвечает: Ерёмин Андрей
Здравствуйте, Загиров Рустам!
Второй конечно, особенно если на table1.id определён индекс. Оператор IN вообще довольно долго работает, особенно если таблицы большие. А причина тому - что делается выборка. Любая выборка требует бОльших затрат, нежели прямое условие.
--------- Нет правила без исключений. Правило без исключений - исключение из правил.
Отвечает: Yumata
Здравствуйте, Загиров Рустам!
В дополнение к предыдущим ответам - не всегда все так однозначно, как в Вашем случае! Иногда лучше проверить! Если Вы работаете с БД InterBase или его клонами - рекомендую воспользоваться великолепной программой IBExpert. Вы можете запустить Ваше SQL-выражение на выполнение и посмотреть время исполнения, и потом принимать решение. Либо программно организовать в цикле выполнение и поставить таймер для вычисления времени...
--------- Кто хочет - найдет способ!
Ответ отправил: Yumata (статус: 1-ый класс)
Ответ отправлен: 12.03.2007, 19:42 Оценка за ответ: 5 Комментарий оценки: Нет, я пользуюсь MySQL, но всё-равно спасибо.
Отвечает: Филатов Евгений Геннадьевич
Здравствуйте, Загиров Рустам!
В любом случае второй запрос будет выполняться быстрее.
Желательно наличие индекса в таблице table2 по полю par_id - при большом количестве записей скорость может увеличиться в разы, хотя некоторые СУБД после первого подобного запроса оптимизируют записи, и последующие запросы с использованием этого условия могут обрабатываться быстрее, чем первый.
Также можно проиндексировать таблицу table1 по полю id.
В Вашем примере первый запрос выполнится в два этапа - сначала сформируется список par_id из таблицы table2, затем для каждой записи в таблице table1 будет находиться соответствие поля id в списке. Желательно добавить сортировку во второй таблице - ( SELECT par_id FROM table2 ORDER BY par_id ) .
Во втором запросе будут сравниваться значения соответствующих полей в таблицах, и при нахождении соответствия, выводится результат. При наличии индексов, будут сравниваться значения индексов, что при меньшем объеме индекса по сравнению с полными записями, значительно ускорит расчет.
Как вариант предпочтения использования первого запроса можно в случае, когда таблицы находятся на разных серверах (если MS SQL, ORACLE и подобные - сервер возвращает только результат запроса, а не скачивает и обрабатывает всю таблицу на машине пользователя - как Access и другие ) , тогда объем передаваемых данных по каналам связи ( сеть, интернет и т.п. ) может быть значительно меньше, чем если бы таблицы сравнивались по значению полей и качалась бы полная таблица ( тем более, если в table2 указан отбор по условию,
не связанный с table1 ) .
С уважением.
Ответ отправил: Филатов Евгений Геннадьевич (статус: 6-ой класс)
Ответ отправлен: 12.03.2007, 20:07 Оценка за ответ: 5 Комментарий оценки: Спасибо
Отвечает: DragonTusk
Здравствуйте, Загиров Рустам!
Второй
Select table.* from table1,table2 WHERE table1.id=table2.par_id
Красивее так (если стадарт SQL92 и выше)
SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.par_id
Ответ отправил: DragonTusk (статус: 3-ий класс)
Ответ отправлен: 12.03.2007, 23:42