Перехід даних, що нагадують дерево, у реляційній базі даних за допомогою SQL


16

Чи є спосіб відстежувати дані дерева у SQL? Я знаю проconnect by в Oracle, але чи є інший спосіб зробити це в інших реалізаціях SQL? Я запитую, оскільки використовувати connect byпростіше, ніж писати цикл або рекурсивну функцію для запуску запиту для кожного результату.

Оскільки, здається, деякі люди бентежать фразою "дані про дерево", я поясню далі: Що я маю на увазі щодо таблиць, які мають parent_id або подібне поле, яке містить первинний ключ з іншого рядка тієї ж таблиці.

Питання виникає з досвіду, коли я працював із таким чином збереженими даними в базі даних Oracle і знав, що connect byце не реалізовано в інших СУБД. Якщо потрібно використовувати стандартний SQL, потрібно було б створити новий псевдонім таблиці для кожного з батьків, який хотів би перейти вгору. Це може легко вийти з рук.


У вас є рішення Джо Селко. Небагато зразків: Дерева в SQL , Дерева та Ієрархії в Oracle , Вкладена модель . Не обов’язково мати синтаксичний цукор ;-).
Мар’ян

Відповіді:


14

Книга Челко - це непоганий ресурс - якщо часом трохи надмірно "академічний".

Я також дійсно знайшов, що цей метод , відомий як «таблиці закриття», працює досить добре.

Якщо ви використовуєте базу даних, яка дозволяє рекурсивні CTE (наприклад, PostgreSQL 8.4 або новіші , або SQL Server 2005 або новіші ), вони дійсно найкращий шлях. Якщо ви на Oracle, завжди є поважні "підключення" .

Згідно з моїм досвідом, набагато частіше передавати набір таблиць у схемі "наївного дерева", і треба з'ясувати, як витягти правильне дерево з цього сховища, ніж мати можливість створити очищувач структура "таблиці закриття".


9

Рекурсивний CTE стане вашим найпростішим рішенням. SQL Server 2005 та поточні версії PostgreSQL підтримують CTE. Якщо ви використовуєте SQL Server 2008 або новішу версію, ви можете використовувати HIERARCHYIDтип даних. Ви можете знайти хороший приклад цього на HierarchyID: моделюйте свої ієрархії даних за допомогою SQL Server 2008

Додаткові ресурси:


5

У SQL Server (2005 та новіші видання) ви можете використовувати загальні вирази таблиць для читання ієрархій, див. Microsoft SQL Server 2005 - CTE Приклад простої ієрархії для кількох прикладів.

Мені порекомендували книгу на цю тему, яка в основному є "Дерева та ієрархії в SQL для розумних" Джо Челко - хоча я ще фактично не переглянув цю книгу.


1

Стандартний метод SQL - це "рекурсивний запит", який надається рекурсивним CTE і позначений як WITH [ RECURSIVE ] у запиті. Реалізація не вказана в специфікації, лише методи, доступні для рекурсивних структур запитів. У найпростішому випадку для реалізації структури даних потрібні лише ідентифікатор та батьківський ідентифікатор у рядку.

Існує також багато специфічних для RDBMS рішень: наприклад, PostgreSQL підтримує рекурсивні CTE, але він також надає ltreeрізний набір переваг та недоліків у реалізації.

Ви можете знайти додаткову інформацію на цьому веб-сайті за допомогою пошуку за тегом .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.