![]() |
#11 |
Участник
|
Возражение против тезиса о том что классификаторы вида id/parentId непомерно тяжеловесны в запросах.
Предположим имеем таблицы: Classif ( id, parentId, level ) // избыточное поле level отнюдь не будет лишним Item ( id, name, ClassifId, ... ) Предполагаемая программа, легко справляющаяся с рекурсией такого классификатора одним запросом должна обладать одним свойством - возможностью делать "динамические запросы". Стараюсь придерживатсья синтаксиса Аксапты, хотя с нарушениями для краткости изложения. Логика универсального запроса, выворачивающего всю структуру таблицы вместе с подчинениями не так уж и сложна на самом деле: Шаг 1: <div class='XPPtop'>X++</div><div class='XPP'>[color=:blue]int[/color] n = ([color=:blue]select[/color] max( level ) [color=:blue]from[/color] Classif).level;</div> Шаг 2: <div class='XPPtop'>X++</div><div class='XPP'> Classif c[ n ]; Item i[ n ]; [color=:blue]select[/color] c[ 1 ] [color=:blue]where[/color] c[ 1 ].ParentId [color=:blue]==[/color] [color=:red]""[/color] [color=:blue]outer[/color] join i[ 1 ] [color=:blue]where[/color] i[ 1 ].ClassifId [color=:blue]==[/color] c[ 1 ].Id [color=:blue]outer[/color] join c[ 2 ] [color=:blue]where[/color] c[ 2 ].ParentId [color=:blue]==[/color] c[ 1 ].Id [color=:blue]outer[/color] join i[ 2 ] [color=:blue]where[/color] i[ 2 ].ClassifId [color=:blue]==[/color] c[ 2 ].Id [color=:blue]outer[/color] join c[ 3 ] [color=:blue]where[/color] c[ 3 ].ParentId [color=:blue]==[/color] c[ 2 ].Id [color=:blue]outer[/color] join i[ 3 ] [color=:blue]where[/color] i[ 3 ].ClassifId [color=:blue]==[/color] c[ 3 ].Id ... [color=:blue]outer[/color] join c[ n ] [color=:blue]where[/color] c[ n ].ParentId [color=:blue]==[/color] c[ n - 1 ].Id [color=:blue]outer[/color] join i[ n ] [color=:blue]where[/color] i[ n ].ClassifId [color=:blue]==[/color] c[ n ].Id</div> Думаю и итоги можно отбирать спокойно подобным образом, сейчас просто нет времени думать над этим. Вопрос теперь в том может ли аксапта быть столь динамичной? Если нет - то можно ведь просто ограничить максимальный уровень вложенности групп классификатора. |
|
|