Здравствуйте, Дмитрий!
Меня очень заинтересовала Ваша статья про иерархические структуры в реляционных базах данных. Я занимаюсь разработкой системы, одной из частей которой является электронный вариант каталога деталей и узлов. Иерархическа структура для такого каталога является единственно возможной: изделие состоит из подсистем, подсистема – из агрегатов, агрегат – из узлов, узел – из деталей, деталь может включать в себя более мелкие детали (винты, гайки и т. п.). Я перебрал много вариантов организации такой иерархической структуры в виде реляционной базы данных; был у меня и тот, что рассмотрен в Вашей статье.
Но в моем случае есть некоторые особенности, не позволяющие воспользоватьс приведенной схемой без изменений:
- Каждая деталь имеет ряд атрибутов, важнейшими из которых являютс наименование и обозначение (чертежный номер). Напр.:
- Соединение поворотное 3.56.1205.1045.00
- Кольцо 5127А-153
- Выбрать для отображения в TTreeView один из этих атрибутов нельзя: ни наименование без обозначения, ни обозначение без наименования не дают достаточной информации человеку, работающему с такой системой. Можно было бы объединить наименование и обозначение в одну строку, но при этом, из-за значительного разброса в длине строк, теряется наглядность.
- Если деталь включает в себя крепеж, складывается ситуация, когда родитель не является суммой своих детей. Поэтому было бы неправильно отображать список детей, как содержимое родителя.
В связи с этими особенностями более предпочтительной мне показалась следующая схема:
- Детали одного уровня отображаются вместе со своими атрибутами в компоненте TDBGrid. Такое представление аналогично Explorer Windows 95, работающему в режиме Таблица.
- При активизации одного из элементов происходит:
- "проваливание" на более глубокий уровень, если активизируется узел, содержащая много деталей;
- "распахивание" элемента , если активизируется деталь, содержаща крепеж.
Под "распахиванием" я подразумеваю отображение детей в списке после родител с некоторым отступом. Напр.:
Кронштейн
Шарнир
Угольник
Кронштейн
Шарнир
Винт
Гайка
Угольник
- При повторной активизации "распахнутого" элемента он "запахивается" :-).
- Кстати, этот же принцип представления информации используется в бумажном оригинале каталога.
Подходящей структурой базы данных будет следующая:
ID OWNER PARENT NAME
1 0 0 Соединение поворотное
2 1 1 Кронштейн
3 1 1 Шарнир
4 1 3 Винт
5 1 3 Гайка
6 1 1 Угольник
Поле
OWNER дает нам информацию для отображения деталей одного уровня, а PARENT содержит информацию о отношениях родитель-потомок.
Ситуация похожа на организацию пользовательского интерфейса в Delphi. Для реализации "распахивающихся" элементов можно применить фильтрацию записей на клиентской машине в сочетании с ведением списка распахнутых элементов данного уровня.
С уважением,
Мухачев Евгений.