2012-10-03 9 views

risposta

10

Come con un RDBMS, dipende dal dominio e dai requisiti di query dei dati.

La tua applicazione richiede un accesso regolare a tutte le versioni dell'oggetto o di solito solo al più recente, con le versioni precedenti disponibili tramite quella corrente? Un esempio di questo potrebbe essere pagine su Wikipedia. Per come esempio, diciamo che abbiamo una pagina che è sulla versione 3. Potremmo allora modellare questo come segue:

(pages)-[:PAGE]->(V3)-[:PREV]->(V2)-[:PREV]->(V1) 
^   ^
    |    | 
category  current 
    node  version of page 

Qui, solo la versione attuale può essere visto a far parte della struttura principale, ma si può desidero consentire a tutte le versioni di far parte di quella struttura. In questo caso, è possibile utilizzare le proprietà di relazione per indicare la versione e hanno tutte le versioni di pagina di collegamento dal nodo categoria:

(V1) 
    ^
    | 
[:PAGE(v=1)] 
    | 
(pages)-[:PAGE(v=2)]->(V2) 
    | 
[:PAGE(v=3)] 
    | 
    v 
    (V3) 

Qui, si può immediatamente attraversare ad una particolare versione della pagina semplicemente specificando la versione in a cui sei interessato

Una terza opzione potrebbe essere che desideri che tutte le versioni precedenti siano completamente separate dalla struttura principale. Per questo è possibile utilizzare più nodi di categoria, uno per (current_pages) e un altro per (old_pages). Poiché ogni pagina viene sostituita da una nuova versione, diventa scollegata dalla precedente categoria e invece collegata a quest'ultima. Ciò costituirebbe più un tipo di "archivio" di sistema in cui le versioni precedenti potrebbero anche essere spostate in un'istanza di database separata.

Quindi avete queste tre opzioni, oltre a più che non ho pensato! Neo4j ti offre una grande flessibilità con questo tipo di design e non c'è assolutamente nessuna risposta "giusta". Se nessuno di questi motivi ti ispira, pubblica un po 'più di informazioni sul tuo dominio in modo che la risposta possa essere più adatta alle tue esigenze.

Cheers, Nige

+0

Grazie, questo mi ha fatto sulla buona strada. Penso che mescolerò i due approcci, perché per alcuni tipi di accesso, ho sempre bisogno della versione corrente (cioè creerò un tipo di relazione '[: CORRENT]' per velocizzarlo) ma per gli altri, ho bisogno di query una versione specifica, quindi aggiungerò una proprietà version alla relazione. –

+0

@AaronDigulla Voglio costruire uno scenario simile. Ho due domande: 1) supponiamo di voler memorizzare un nodo versione di una 'Car' e di avere un indice posizionato sul campo' carId' (UUID). Non è un problema finire con 3 versioni di 'Car's, con lo stesso identico campo indicizzato (potenziale conflitto con una query come" Recupera l'auto 32 "?)? 2) Con la tua soluzione '[: CURRENT]', immagino, ad ogni nuova versione, devi interrompere la precedente relazione '[: CURRENT]' per puntare alla nuova 'Car'version, e questa punta a un'altra' [: PRECEDENTE] 'relazione sulla precedente' Car'? – Mik378

+1

Per la tua prima domanda, prenderei in considerazione la possibilità di rendere l'UUID rappresentativo di un oggetto immutabile, cioè una combinazione di auto + versione.Ogni revisione creerebbe quindi un nuovo UUID e questi potrebbero quindi essere concatenati per rappresentare la cronologia delle versioni. Per la seconda domanda: sì - le relazioni dovrebbero essere interrotte e ricostruite per ogni nuova versione visualizzata (in modo simile all'inserimento di un elemento in una lista collegata). –

1

Si potrebbe anche avvicinarsi dall'altra parte:

(pages)-[:VERSION]->(V1)-[:VERSION]->(V2)-[:VERSION]->(V3) 
^            ^
    |             | 
category           current 
    node           version of page 

vantaggio: quando si crea una nuova versione, si aggiunge solo alla fine della catena, non è necessario "inserirla" tra la (pagina) e la versione corrente.

svantaggio: non si possono semplicemente buttare via vecchie versioni, a meno che non si ricostruisca la catena. Ma probabilmente non è un'operazione frequente.

Problemi correlati