Як побудувати модель, щоб правильно та ефективно представити деревоподібні дані на реляційних базах даних?


13

На основі обходу даних, що нагадують дерево, у реляційній базі даних, використовуючи питання SQL , я хотів би знати, як спосіб, який регулярно використовується для опису деревоподібних даних у реляційних базах даних, враховуючи фізичні наслідки?

Я припускаю, що RDBMS не має особливих функцій для обробки, крім звичайних SQL ANSI або загальних доступних функцій.

В сумніві, мене завжди цікавлять MySQL і PostgreSQL і, врешті-решт, SQLite.

Відповіді:


8

Я вірю, що він збирається на щось на зразок бінарного дерева. Я б просто включив три клавіші, які прив’язані до унікального ідентифікатора тієї ж таблиці, один для лівої, один для правої дитини та один для батьків.

тобто- (дуже багато псевдокоду)

TABLE tree
int         id                  autoinc
varchar(16) data_you_care_about
int         parent_id
int         left_child_id
int         right_child_id

FOREIGN KEY parent_id = tree.id
FOREIGN KEY left_child_id = tree.id
FOREIGN KEY right_child_id = tree.id

Розгляд подвійно пов'язаного елемента полягає в тому, що будь-які зміни положення дерева за цією схемою призведуть до не менше 3 оновлень замість одного. Як ви заявляєте, це також є великим припущенням, що бінарне дерево вперед / назад - це те, що вимагали.
REW

Дуже правда, в моєму досвіді я віддаю перевагу податку на оновлення подвійно пов'язаного списку перед односхилим списком, оскільки мені часто доводиться обходити дерево. але в багатьох випадках це було б не потрібно
Патрік

Це безумовно залежить від основної моделі. Я думаю, що відповіді, яку дав Патрік, достатньо, якщо це правильна модель.
jcolebrand

6

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

Для сутностей, які зв'язані в декількох точках дерева, буде використовуватися окрема таблиця посилання або стовпчик з декількома різними значеннями.

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