Показать сообщение отдельно
Старый 06.11.2015, 12:03   #6  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5813 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если прям очень нужен иерархический справочник, то стоит посмотреть, как реализованы те же категории продуктов (таблица EcoResCategory) в AX2012, в первую очередь с т.з. схемы данных и поддержки дополнительных служебных полей и таблиц:
  • ссылка на родительский узел (поле EcoResCategory.ParentCategory) - куда же без нее
  • уровень текущего узла (поле Level)
  • левые и правые ключи для работы с моделью вложенных множеств (поля NestedSetLeft, NestedSetRight) и логика их обновления - используются для реляционной работы с деревом вместо рекурсивного обхода уровней, см. также Nested Set model
  • соответствующие индексы, в т.ч. уникальные
Кроме этого, в AX2012 для Розницы в дереве иерархий могут быть сделаны "исключения", когда иерархические отношения настраиваются не в самом дереве, а в рамках тех или иных акций. Для поддержки таких исключений и упрощения реляционной работы с узлами дерева в модуле Розница есть вспомогательная таблица RetailCategoryContainmentLookup, содержащая все комбинации {узел, родительский узел}, и соотв. логика ее обновления. Также надо обратить внимание на то, что в иерархиях категорий, как и во многих других местах AX2012, первичным ключом записи является RecId, и все ссылки тоже сделаны по RecId.
В таком варианте (ссылки по RecId, модель вложенных множеств) SQL-запросы по категориям работают весьма шустро даже на очень больших и многоуровневых деревьях.
За это сообщение автора поблагодарили: r2d2 (1).