Dimitri: Umsetztung einer Versionierung

Hallo an alle,
Wir verwenden

MySQL Server Version: 5.0.24-standard
MySQL-Client-Version: 5.0.37
phpMyAdmin - 2.11.9.1

Ich muss eine Versionierung  abbilden und in der DB speichern.
Jetzt habe ich das Problem das die Versionierung so aussieht:
1
1.1
1.2
1.XXXXXX
2

Mein Problem besteht in der Wahl des Typs des Datenbankfeldes für die Version.
dh. wenn ich diese INT nehme, habe ich ka nur Ganze zahlen.
Wenn ich VARCHAR nehme, habe ich eine sehr komische Sortierung(1.1   1.10  1.2)
wenn ich Double oder float nehme, habe ich das Problem das ich die Nachkommastellen angeben muss. Dh. wenn ich 2 angebe kommt 1.01

Hat einer von euch ne Idee wie man eine Versionierung am Besten abbilden kann?

DANKE

  1. Hello,

    Ich muss eine Versionierung  abbilden und in der DB speichern.
    Jetzt habe ich das Problem das die Versionierung so aussieht:
    1
    1.1
    1.2
    1.XXXXXX
    2

    Mein Problem besteht in der Wahl des Typs des Datenbankfeldes für die Version.
    dh. wenn ich diese INT nehme, habe ich ka nur Ganze zahlen.
    Wenn ich VARCHAR nehme, habe ich eine sehr komische Sortierung(1.1   1.10  1.2)
    wenn ich Double oder float nehme, habe ich das Problem das ich die Nachkommastellen angeben muss. Dh. wenn ich 2 angebe kommt 1.01

    Nimm varchar und fülle die Felder linksseitig mit einem neutralen Element (Codepoint kleiner als die gültigen Zeichen) auf. Das Auffüllen geht z.B. mit einem Trigger oder besser eine Stored Procedure beim Eintragen automatisch.

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Nimm varchar und fülle die Felder linksseitig mit einem neutralen Element (Codepoint kleiner als die gültigen Zeichen) auf. Das Auffüllen geht z.B. mit einem Trigger oder besser eine Stored Procedure beim Eintragen automatisch.

      kannst du das bitte näher erläutern
      danke

      1. Hello,

        Nimm varchar und fülle die Felder linksseitig mit einem neutralen Element (Codepoint kleiner als die gültigen Zeichen) auf. Das Auffüllen geht z.B. mit einem Trigger oder besser eine Stored Procedure beim Eintragen automatisch.

        kannst du das bitte näher erläutern

        Ich war davon ausgegangen, dass Du nicht nur numerische Werte hast und trotzdem sortieren können willst. Deshalb dacht ich an mehrere Spalten im Typ VarChar mit linksseitiger Auffüllung.

        Sonst ist natürlich Vinzenz' Vorschlag besser.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  2. Hallo,

    Ich muss eine Versionierung  abbilden und in der DB speichern.
    Jetzt habe ich das Problem das die Versionierung so aussieht:

    1
    1.1
    1.2
    1.XXXXXX
    2

    Mein Problem besteht in der Wahl des Typs des Datenbankfeldes für die Version.
    dh. wenn ich diese INT nehme, habe ich ka nur Ganze zahlen.
    Wenn ich VARCHAR nehme, habe ich eine sehr komische Sortierung(1.1   1.10  1.2)

    nimm zwei INTEGER-Spalten (z.B. major und minor), erlaube in minor NULL-Werte, verwende für die Anzeige eine berechnete Spalte (CONCAT, unter Verwendung von COALESCE).

    Freundliche Grüße

    Vinzenz

    1. wie bekomme ich bei dieser Umsetztung die höchste Version raus?

      1. Hallo,

        wie bekomme ich bei dieser Umsetztung die höchste Version raus?

        ganz simpel:

        order by major DESC, minor DESC

        ggf. bei minor NULL-Werte berücksichtigen. bzw. dort NULL-Werte nicht zulassen, statt dessen 0 verwenden und bei der Ausgabe .0 entfernen.

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          ganz simpel:

          order by major DESC, minor DESC

          ggf. bei minor NULL-Werte berücksichtigen. bzw. dort NULL-Werte nicht zulassen, statt dessen 0 verwenden und bei der Ausgabe .0 entfernen.

          Bei Verwendung von 0 (statt NULL):

          Beispiel (tabelle versionierung):

          major | minor
          ------+------
            1   |   0
            1   |   1
            1   |   2
            1   |  12
            2   |   0
            2   |   1
            2   |   2

          und

          SELECT  
              -- sorge dafür, dass die Versionen 1 und nicht 1.0 lauten  
              [link:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat@title=CONCAT](major, [link:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if@title=IF](minor = 0, '', CONCAT('.', minor))) version  
              -- und gib der berechneten Spalte einen sprechenden Namen: version  
          FROM  
              versionierung  
          ORDER BY  
              major DESC,  
              minor DESC  
          
          

          liefert

          version
          -------
          2.2
          2.1
          2
          1.12
          1.2
          1.1
          1

          Mit LIMIT kannst Du dies auf die neueste Version eingrenzen (limitieren).

          Freundliche Grüße

          Vinzenz

      2. wie bekomme ich bei dieser Umsetztung die höchste Version raus?

        Danke dir vielmals!
        Habs hinbekommen!

  3. hi,

    Ich muss eine Versionierung  abbilden und in der DB speichern.
    Jetzt habe ich das Problem das die Versionierung so aussieht:
    1
    1.1
    1.2
    1.XXXXXX
    2

    Mein Ansatz wäre der, dass ich die Versionen als Integer speichere. Mal angenommen, die Maximalversion wäre 255.255, dann bräuchtest Du dafür 16 Bit wie folgt:

    |_|_|_|_|_|_|_|_|.|_|_|_|_|_|_|_|_|

    |_ a _|         |_ b _|

    Die Umrechnung geht mit Bit-Operatoren oder algebraisch:

    int = (a * 255 exp 1) + (b * 255 exp 0)

    (das wäre auch die Umsetzung von Vinzenz "major.minor")

    Hotte

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.