Возражение против тезиса о том что классификаторы вида 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>
Думаю и итоги можно отбирать спокойно подобным образом, сейчас просто нет времени думать над этим.
Вопрос теперь в том может ли аксапта быть столь динамичной?
Если нет - то можно ведь просто ограничить максимальный уровень вложенности групп классификатора.
|