2012-10-03 9 views

Antwort

10

Wie bei einem RDBMS hängt dies von den Anforderungen Ihrer Domäne und Datenabfrage ab.

Benötigt Ihre Anwendung regelmäßig Zugriff auf alle Versionen des Objekts oder in der Regel nur auf die neuesten, mit den älteren Versionen verfügbar über die aktuelle? Ein Beispiel dafür könnten Seiten auf Wikipedia sein. Wie als Beispiel, lassen Sie uns sagen, dass wir eine Seite, die 3. auf Version Wir könnten dann dieses Modell wie folgt:

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

Hier wird nur die aktuelle Version zu sehen ist Teil der Hauptstruktur zu bilden, aber sie können Ich möchte, dass alle Versionen einen Teil dieser Struktur bilden. In diesem Fall könnten Sie Beziehung Eigenschaften verwenden, um die Version anzuzeigen, und alle Seiten Versionen verknüpfen haben aus der Kategorie Knoten:

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

Hier können Sie sofort auf eine bestimmte Version der Seite durchqueren, indem Sie einfach unter Angabe der Version in was du interessiert bist.

Eine dritte Option könnte sein, dass Sie möchten, dass alle älteren Versionen vollständig von der Hauptstruktur getrennt sind. Dazu können Sie mehrere Kategorieknoten verwenden, einen für (current_pages) und einen weiteren für (old_pages). Da jede Seite durch eine neue Version ersetzt wird, wird sie von der früheren Kategorie getrennt und stattdessen mit dieser verlinkt. Dies würde eher ein "Archiv" -Typ von System bilden, wo die älteren Versionen sogar in eine separate Datenbankinstanz verschoben werden könnten.

So haben Sie diese drei Optionen, plus mehr, an die ich nicht gedacht habe! Neo4j ermöglicht Ihnen eine große Flexibilität mit dieser Art von Design und es gibt absolut keine "richtige" Antwort. Wenn Sie jedoch keine davon inspirieren, posten Sie etwas mehr Informationen über Ihre Domain, damit die Antwort besser auf Ihre Bedürfnisse zugeschnitten werden kann.

Cheers, Nige

+0

Danke, das hat mich auf den richtigen Weg gebracht. Ich denke, ich werde die beiden Ansätze miteinander kombinieren, da ich für einige Zugriffsarten immer die aktuelle Version benötige (dh ich werde eine '[: CURRENT]' Art von Beziehung erstellen, um das zu beschleunigen), aber für andere muss ich Abfrage einer bestimmten Version, also werde ich der Beziehung eine Versionseigenschaft hinzufügen. –

+0

@AaronDigulla Ich möchte ein ähnliches Szenario erstellen. Ich habe zwei Fragen: 1) Nehmen wir an, dass ich einige versionierte Knoten eines "Car" speichern möchte und dass ich einen Index auf das Feld "carId" (UUID) gesetzt habe. Ist es kein Problem, 3 versionierte Autos zu bekommen, die genau das gleiche indizierte Feld haben (möglicher Konflikt mit einer Abfrage wie "Retrieve the Car 32"?)? 2) Mit Ihrer Lösung "[: CURRENT]" stelle ich mir vor, dass Sie bei jeder neuen Version die vorherige '[: CURRENT]' - Beziehung unterbrechen müssen, um auf die neue 'Car' - Version zu zeigen, und diese mit einer anderen symbolisiert' [: PREVIOUS] 'Beziehung zum vorherigen' Auto'? – Mik378

+1

Für Ihre erste Frage würde ich überlegen, ob die UUID ein unveränderliches Element darstellt, d. H. Eine Kombination aus Auto + Version.Jede Revision würde dann eine neue UUID erstellen, und diese könnten dann verkettet werden, um den Versionsverlauf darzustellen. Für Ihre zweite Frage: Ja - die Beziehungen müssten für jede neue Version, die angezeigt wird, gebrochen und neu erstellt werden (ähnlich wie beim Einfügen eines Elements in eine verknüpfte Liste). –

1

Sie könnten auch von der anderen Seite nähern:

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

Vorteil: Wenn Sie eine neue Version erstellen, fügen Sie es nur am Ende der Kette, kein muss es zwischen der (Seite) und der aktuellen Version "einfügen".

Nachteil: Sie können nicht einfach alte Versionen wegwerfen, es sei denn, Sie rekonstruieren die Kette. Aber das ist wahrscheinlich keine häufige Operation.

Verwandte Themen