Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 227
от 18.03.2007, 14:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 392, Экспертов: 45
В номере:Вопросов: 2, Ответов: 9


Вопрос № 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 подраздела, к какому разделу относится, название подраздела?
Отправлен: 12.03.2007, 17:12
Вопрос задал: Райкин Сергей Александрович (статус: 3-ий класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Райкин Сергей Александрович!

Реально легче построить в одной таблице дерево, и дальше работать с ним как с деревом или как с 2-3 списками.

Сейчас пишу книгу по древовидным, могу высласть первую часть с простыми деревьями
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 12.03.2007, 17:21
Оценка за ответ: 5
Комментарий оценки:
Спасибо за комментарий. Если можете высылайте, почитаю.

Отвечает: Ерёмин Андрей
Здравствуйте, Райкин Сергей Александрович!
На мой взгляд, рациональнее хранить всё в одной таблице. Просто "корневые" разделы, т.е. те, которые никому не принадлежат, будут иметь parent_id = 0. Одну таблицу и обрабатывать проще и быстрее, даже и памяти она меньше занимает, ведь при наличии второй таблицы поле id_раздела будет хранится дважды. При построении дерева из такой таблицы нужно применить рекурсию, т.е. сначала читаются базовые разделы, затем для каждого базового читаются его подразделы, для каждого подраздела читаются подразделы второго порядка и т.д.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Всё для программиста. Файловый архив, статьи, помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 12.03.2007, 19:21
Оценка за ответ: 5
Комментарий оценки:
Спасибо за подтверждение. Так уже и делаю.

Отвечает: Илья Андреевич
Здравствуйте, Райкин Сергей Александрович!
Вообще не так.
в первой таблице надо хранить айди и названия, а во второй их структуру вида: 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:14
Вопрос задал: Загиров Рустам (статус: Специалист)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Загиров Рустам!

Однозначно второй запрос выполняется быстрее, часто в разы
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 12.03.2007, 19:19
Оценка за ответ: 5
Комментарий оценки:
ок, спасибо, буду знать теперь

Отвечает: Ерёмин Андрей
Здравствуйте, Загиров Рустам!
Второй конечно, особенно если на table1.id определён индекс. Оператор IN вообще довольно долго работает, особенно если таблицы большие. А причина тому - что делается выборка. Любая выборка требует бОльших затрат, нежели прямое условие.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Всё для программиста. Файловый архив, статьи, помощь, советы, обмен опытом.
ICQ: 286867644
----
Ответ отправлен: 12.03.2007, 19:27
Оценка за ответ: 5
Комментарий оценки:
Спасибо за небольшое объяснение.

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.45 beta от 20.02.2007
Яндекс Rambler's Top100

В избранное