![]() |
+7 (495) 229-0436 | ![]() |
shopadmin@itshop.ru | 119334, г. Москва, ул. Бардина, д. 4, корп. 3 | ![]() |
![]() |
![]() |
|
|
Степени - ключ к быстрой иерархии (пример на Django)15.01.2013 15:05
burdin
Есть множество способов организации иерархического хранения данных. В последнее время меня заинтересовал вопрос по структуре каталога, например, интернет-магазина. А именно, когда Группы и Товары хранятся в разных таблицах. Хотелось бы, имея код Группы, получить быстрый запрос к таблице Товаров, результатом которого были бы Товары из текущей Группы и всех ее Подгрупп. Тогда, чтобы получить Товар из всех Подгрупп, потребуется обойти поддерево, собрать все коды Детей и вставить их в запрос к таблице Товаров. Способ, самый медленный для чтения. Можно еще добавить в таблицу Групп строковое поле: В нем кодируется иерархия Групп. Получается примерно так: 1. А; Это поле является ключом Группы в таблице Товаров. Таким образом, мы можем не совершать обход дерева Групп для вывода Товаров из всех Подгрупп, а сделать все одним запросом. Минусы: Можно избавиться от последнего недостатка сделав данное поле числовым.
Таблица Групп будет выглядеть так: Таблица Товаров: Тогда все товары из Группы и всех Подгрупп можно будет получать одним запросом указав диапазон кодов. Например, для Товаров из Группы 16 и всех ее Подргупп (Рис.1, Таблица.2), нужно будет выбрать диапазон (GROUP >=16) AND (GROUP<32) Следующий недостаток такого подхода - ограниченность вариантов. Но так ли он принципиален? Максимальное 32-х битное беззнаковое целое = 4 294 967 296. Если использовать ключ такого типа, то, например, при 6 Уровнях можно получить 39 Детей для каждого Родителя, при 7 уровнях - 23, при 5 - 83 и т.д… Максимальное необходимое значение ключа можно найти по формуле: Если БД не имеет возможность хранить беззнаковое целое, мы можем использовать и отрицательный диапазон, просто задаем самый "верхний" элемент (корень дерева) отрицательным числом. Для максимального использования 32-х разрядного целого, при 6 уровнях и 39-и Детях это будет - 2 048 000 000.
Для примера с иллюстрации выше (Рис.2), максимальное беззнаковое целое равно 64, если задействовать отрицательный диапазон, то root надо будет поставить = -32 Для большинства задач 4 294 967 296 более чем достаточно (по крайней мере мне). Нужно больше Уровней - уменьшаем количество Детей, и наоборот. Если же такие "рамки" для кого-то окажутся все же тесны, можно взять 64-х битное целое. Скорость работы с такими значениями будет почти такой же. Чтобы проверить все это в работе я сделал простейшее Django приложение. В модель ввел 2 дополнительных поля - Уровень и КоличествоУжеИмеющихсяДетей. Так же реализовал добавление нового элемента Группы и его удаление. Настройки для дерева сейчас там стоят такие: КоличествоДетей = 39, КоличествоУровней = 6. Ключ - 32-х разрядное целое. Конечно же их можно поменять (при изменении настроек в таблице должна быть только одна запись - root).
Чтобы быстро проверить работу, можно сделать тест для получения дерева как на Рис.1 Таблица 2. Для этого надо внести в таблицу root-элемент со значениями: Конечно, чтобы все работало полноценно, в код надо будет еще добавить: Этого пока не сделал (программирование, в течении 15 последних лет - только мое хобби), но не вижу препятствий для реализаций данных алгоритмов. Таким образом, получилась структура, работающая гораздо быстрее чем при использовании закодированного символьного ключа, ну и занимающая меньше места. При использовании int64, ограничение по размерам иерархической таблицы, будут значительно ниже. Но и int32 хватит для большинства задач, все-таки в иерархии хранятся только Группы, а каталогов с параметрами, где Дети>39 и Уровни>6, я пока не встречал (ну или не замечал). Ссылки по теме |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.
На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.
|
119334, г. Москва, ул. Бардина, д. 4, корп. 3 +7 (495) 229-0436 shopadmin@itshop.ru |
|
© ООО "Interface Ltd." Продаем программное обеспечение с 1990 года |