Анотація: Ця лекція присвячена збереженню деревовидних структур в базі даних. Ви дізнаєтеся, як можна зберегти дерево з необмеженою кількістю гілок в таблицю, і як слід його назад в компонент TreeView.
Деревовидні структури не мають прямого відношення до програмування баз даних, проте, програмісту нерідко доводиться "винаходити велосипед", придумуючи різні рішення збереження таких структур в таблиці, і зворотне їх зчитування в дерево.
Типовий приклад дерева - всім знайоме дерево каталогів. Прикладів таких структур безліч - це можуть бути відділи в будь-якому закладі або розділи бібліотеки. Подивимося на малюнок з фрагментом дерева розділів бібліотеки:
Мал. 10.1. дерево розділів
Основна складність зберігання дерев в таблиці - це те, що ми не знаємо заздалегідь, яка буде глибина вкладеності розділів. Можна було б створити таблицю з 10 полями, наприклад. Але якщо вкладених розділів буде менше, то таблиця буде неефективна - залишиться багато порожніх полів. А якщо більше - обмежувати користувача?
Найпростіший спосіб збереження структури дерева і її зчитування назад - скористатися тим, що дерево - це список вузлів, і має добре знайомі нам методи:
Однак цей спосіб має масу недоліків. По-перше, в результаті отримаємо простий текстовий файл. в якому вкладені вузли розташовуються нижче батька і мають відступ. Користувач легко може випадково або навмисно зіпсувати такий файл. відредагувавши або просто видаливши його з диска, і програма буде працювати з помилками. По-друге, зазвичай деревоподібна структура тісно пов'язана з іншими даними, наприклад, таблиця відділів підприємства пов'язана зі службовцями цього підприємства - запис кожного службовця має посилання на відділ, де він працює. Якщо структуру підприємства зберігати як простий текстовий файл, то такий зв'язок складно буде забезпечити.
Коли програміст вперше стикається з необхідністю зберігання деревовидних структур в базі даних, зазвичай він першим ділом підключається до Інтернету і шукає якоїсь компонент. який би дозволив це робити. Але не всі нестандартні компоненти працюють якісно, та й навіщо шукати якийсь новий компонент. коли є стандартний TreeView на вкладці Win32 Палітри компонентів. Саме з цим компонентом ми і будемо працювати в даній лекції.
Рецептів роботи з деревами в базах даних багато, ми розглянемо лише один з них, досить ефективний і в той же час простий. Сенс цього методу полягає в тому, щоб в кожного запису таблиці зберігати номер вузла розділу, номер його батька, якщо він є, і назва вузла. У разі якщо вузол не має батька (головний вузол, наприклад, "Художня література" в малюнку 10.1), то в відповідне поле запишемо нуль.
підготовка проекту
Для реалізації прикладу нам буде потрібно нова база даних. Завантажте MS Access і створіть базу даних "TreeBD", а в ній таблицю "Razdels". Взагалі-то, в базі даних MS Access як таблиці, так і поля можуть мати російські назви, проте ми будемо використовувати кошти SQL. який не завжди коректно обробляє російські ідентифікатори. Крім того, даний спосіб можна використовувати в будь-який СУБД. а далеко не всі з них так попереджувальні, як MS Access. тому назва таблиці і її полів виконаємо латиницею.
Таблиця буде мати три поля:
Таблиця 10.1. Поля таблиці "Розділи"