Come strutturare un modello per rappresentare in modo corretto ed efficiente i dati ad albero su database relazionali?


13

Basandomi sul passaggio di dati simili ad alberi in un database relazionale utilizzando la domanda SQL , vorrei sapere come utilizzare regolarmente il modo di descrivere i dati simili ad alberi su database relazionali considerando le implicazioni fisiche?

Suppongo che l'RDBMS non abbia funzioni speciali per la gestione oltre a normali SQL ANSI o funzionalità comuni disponibili.

Nel dubbio, sono sempre interessato a MySQL, PostgreSQL e infine a SQLite.

Risposte:


8

Credo che stia cercando qualcosa come un albero binario. Includerei solo tre chiavi che sono legate all'ID univoco della stessa tabella, una per la sinistra, una per il figlio destro e una per il genitore.

ie- (molto pseudocodice)

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

Una considerazione per un elemento doppiamente collegato è che qualsiasi modifica nella posizione dell'albero in questo schema comporterebbe non meno di 3 aggiornamenti anziché uno. Come dici tu, questo è anche un grande presupposto che un albero binario avanti / indietro è ciò che è stato richiesto.
REW

molto vero, nelle mie esperienze preferisco la tassa di aggiornamento di un elenco doppiamente collegato a un elenco singolo collegato poiché spesso devo attraversare un albero. ma in molti casi ciò non sarebbe necessario
Patrick

Dipende sicuramente dal modello sottostante. Penso che la risposta data da Patrick sia sufficiente se questo è il modello giusto.
jcolebrand

6

Se ogni nodo è veramente la stessa entità di dati, il paradigma significherebbe comunque una tabella per entità e una colonna di collegamento per l'attraversamento dell'albero in cui ogni nodo è collegato solo una volta.

Per le entità collegate in più punti dell'albero, verrà utilizzata una tabella di collegamento separata o una colonna con più valori distinti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.