Objektversionierung version_id?

Hallo an alle,

ich habe es leider in der Dokumentation und Forum nicht gefunden, was es mit der version_id, welche bei vielen Tabellen (und natürlich Entities) vorhanden ist, auf sich hat. Leider habe ich auch bei einer Google-Suche  (shopware 6 “version_id” site:docs.shopware.com) nur die eine Seite in der Dokumentation gefunden.

Mir ist bewusst, dass sich die Inhalte des version_id Feldes auf die Shopware-Version beziehen.

In der Dokumentation steht, wir sollen für Verweise auf Shopware-eigene Objekte die id und version_id Felder als kombinierten Primary Key nutzen.

Auf meinem Entwicklungssystem sind für Shopware-Objekte nur Objekte mit der selben version_id eingetragen. Auf einer anderen Testinstallation, auf der wir bereits Updates gemacht haben, sind von vielen Objekten Duplikate mit einer abweichenden version_id generiert worden. Ich vermute, das hat etwas mit dem Updateprozess zu tun.

Meine Fragen:

  1. Wann werden neue Objektduplikate mit angepasster VersionsID erzeugt? Bei Updates der eigenen Shopware-Installation?
  2. Kann ich mich darauf verlassen, dass es immer jedes Objekt mit der version_id der aktuell installierten Shopware-Version, gibt?
  3. Wie aktualisiere ich meine eigenen, domänenspezifischen Entitäten, welche auf Shopware-Objekte mit version_id zeigen? In einem Event, das durch den Updateprozess ausgelöst wird?
  4. Muss ich für jede eigene Entität, die auf ein Shopware-Objekt mit version_id verweist, auch selbst in der Form versionieren und “Duplikate” meiner Objekte mit unterschiedlichen version_id Einträgen erstellen, oder ist es ausreichend, nach einem Update nur mehr auf die aktuellste version_id des entsprechenden Objektes zu verweisen?
  5. [Edit]: Falls bei jedem Update neue Tabelleneinträge mit neuer version_id für bestehende Objekte angelegt werden - was passiert dann, wenn ich z.B. eine Bestellung, welche in order.version_id ein Versionsfeld hat, über den Administrationsbereich editiere? Werden dann auch automatisch die “älteren” Versionen der Bestellung angepasst?

In meinem Fall geht es um eine vollständige Eigenentwicklung eines Plugins, welches bei genau einem Kunden zum Einsatz kommen wird, und bei welcher ich alleinigen Zugriff auf die Shopware-Installation habe.

 

Hallo, hat hierzu jemand Informationen zur Verfügung?

Für teilweise Antworten bin ich natürlich auch dankbar.

Eine erneute Google Suche hat leider nach wie vor keine Ergebnisse ans Licht gebracht.

Wie löst ihr diese Herausforderung mit Domänenobjekten, welche auf (versionierte) Shopware-Objekte verweisen?

Um hier die Diskussion einmal anzustoßen gebe ich zumindest zu einem Punkt mal eine Rückmeldung:

3 und 4. Im DAL wird die version_id automatisch mit berücksichtigt, d.h. wenn du dir die verknüpfte entity über eine association ziehst erhältst du automatisch die korrekte (neueste). Du musst dort nichts berücksichtigen. 
Das ganze passiert hier: shopware/core/Framework//DataAbstractionLayer/VersionManager.php 

Das ganze erst mal ohne Gewähr - aber lt. Quelltextanalyse sollte das so sein.

 

SG
Jens

 

1 „Gefällt mir“

Seit einem Jahr frage ich mich wofür genau man diese version_id spalte braucht. Was sind die usecases dafür genau? Sind die Versions immer relevant, auch bei Pluginentwicklung? Wann genau würde der shop in die Luft fliegen wenn man in seinen Queries und Assotiationen die version_id nicht einbezieht? Es wäre wirklich zum Vorteil wenn uns Shopware die Gründe für diese Architekturentscheidung verraten würde? @shyim @Moritz_Naczenski

Die Version Spalte dient dazu einen Datensatz schonmal zu bearbeiten ohne ihn Live zu haben. Dies wird zurzeit nur aktiv im Bestell Module im Admin verwendet. Wenn du die Bestellung bearbeitest wird eine neue Version der Bestellung angelegt. Alle Änderungen passieren auf dieser Version. Sobald man speichert wird die bearbeite Version mit der Live Version gemergt und die Änderung ist live zusehn.

Dies wird auch im Zukunft im CMS verfügbar sein, so dass man CMS Änderungen vorbereiten kann in Versionen und diese mergt wenns Live soll.

Für Plugins ist dies relevant, da eine Association zu einer versionierten Entity auch eine VersionID braucht

6 „Gefällt mir“

Hallo,

eine neue Version einer Bestellung wird auch angelegt, wenn man z.B. einen Beleg erzeugt, der Beleg verweist dann auf die neue versionierte Bestellung. Also einfach mal einen Beleg (Lieferschein oder Rechnung) erstellen und dann in der DB schauen.

Viele Grüße,
Werner.

Ich würde das gerne nochmal „aufwärmen“ wollen.

Nach meiner Beobachtung ändern sich die version_ids in den meisten Tabellen nicht. Und tatsächlich scheint das ja die „Datenbank-Version“ zu sein. Die version_id ist ja auch über die Tabellen hinweg statisch und gleich.
Ich verstehe ich das dann, dass hier noch ein Feature aussteht ? Was steckt denn dahinter, eine Versionierung bzgl. der Daten oder bezogen auf die Datenbank. Leider lässt sich kein echtes Schema erkennen, welche Tabellen denn nun „versioniert“ sein sollen oder nicht. Wichtiger ja noch für eigene (neue) Entities ob diese auch selbst versioniert werden sollten.
Wir arbeiten z.B. gerade an der Versionierung für eine eigene Preis-Berechnung, die „product_price“ entity hat ja eine Version_Id, also dann bei uns auch sinnvoll ?

Auf der anderen Seite hat die Kunden-Tabelle dann keine version_id - da entstehen bei mir leider nur Fragezeichen ?

Wäre wenn es dazu ein wenig Aufklärung gäbe.

(@Moritz_Naczenski oder wer immer hier die Ansprechpartner ist)