Quali sono alcuni progetti di database che supportano la traccia di lignaggio?

1

Ambiente

  • PostgreSQL 9.1
  • Java

Problema

Cercherò di illustrare il problema qui nel modo più semplice possibile:

Sto provando a registrare la seguente relazione:

Nodo 1 = > Nodo 2 = > Nodo 3

Dove il Nodo 1 è il genitore del Nodo 2 e il Nodo 2 è il genitore del Nodo 3. Nella tabella del database, il progetto iniziale sta monitorando questi dati in un elenco collegato. Tuttavia, sto trovando questo estremamente inefficiente perché ogni volta che voglio tracciare il lignaggio di dire Nodo 1, dovrei recuperare il Nodo 2, quindi con il Nodo 2, vorrei recuperare il Nodo 3. Dato che mostrerei il lignaggio del Nodo 1 per l'utente, dovrei fare 3 chiamate separate al database per visualizzare queste informazioni.

Mi piacerebbe anche tornare indietro, ma per semplicità ho lasciato questa parte.

Alternative

Alcune alternative che ho considerato, ma non posso andare in questo momento sono Neo4j e altre soluzioni come questo. Purtroppo, in questo momento, devo rimanere in Postgresql.

Domanda

Esiste uno schema di progettazione tale da poter recuperare tutte queste informazioni contemporaneamente? Se c'è, come implementeresti con l'esempio sopra?

UPDATE

Con il commento di @ MichaelT e la ricerca di Common Table Expressions, sono stato indirizzato a questo link, che sembra fornire maggiori informazioni al riguardo: link

    
posta hulkmeister 23.04.2013 - 21:37
fonte

1 risposta

2

Mentre la query ricorsiva di PostgreSQL potrebbe essere la strada da percorrere qui, la tua relazione è anche un caso speciale di un grafico aciclico diretto (DAG). Dai un'occhiata a link e considera anche il passaggio da PostgreSQL a < a href="http://en.wikipedia.org/wiki/Graph_database"> database grafico , come Neo4j .

Un'altra possibilità sarebbe quella di aggiungere un ID aggiuntivo a ciascun record che associa genitori, figli, nipoti, ecc. in famiglie . Genitori e figli potrebbero condividere un ID di famiglia comune, che verrebbe indicizzato, quindi il recupero di tutti i record correlati potrebbe essere fatto in una singola query (veloce). Se includi i collegamenti a ritroso, non importa da dove parti: puoi lavorare avanti e indietro attraverso il set di risultati per ordinare i nodi. Si potrebbe anche portare l'intera famiglia nella RAM per una manipolazione veloce al di fuori di PostgreSQL. Sì, ci sarebbe un ulteriore sovraccarico nel mantenimento di ID di famiglia coerenti attraverso le operazioni CRUD, ma potresti realizzare una vittoria netta in termini di prestazioni.

    
risposta data 24.04.2013 - 02:38
fonte

Leggi altre domande sui tag