Raum-/Bettenbelegung über Bitmaske - für große Dimensionen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Raum-/Bettenbelegung über Bitmaske - für große Dimensionen

    Ein Brainstorming-Forum, sehr schöne Idee

    Ich steh auch mal wieder vor dem Problem, dass PHP nur bis 32-Bit rechnen kann.
    Das klingt soooo viel, isses aber bei einer riesigen Anzahl beliebig kombinierbarer Räume oder Plätze überhaupt nicht. Da arbeitet man sinnvollerweise mit Bitmasken.Die Binärzahl

    Code:
    1000 0000 0000 0000 0000 0000 0000 0011
    bedeutet natürlich, dass Raum Nr. 32, Raum Nr. 2 und Raum Nr. 1 belegt sind.
    Die 1 links bedeutet in (dezimaler) Wirklichkeit den stolzen Wert von 2 hoch 31, was wohl begreifen lässt dass hier selbst 128 Bit gar nix besonderes und im Nu erreicht sind!

    Ein schönes Beispiel wäre die Drei ???-Folge "Die gefährliche Erbschaft" (17), in der der Ozeandampfer "Queen of South" [QoS] 500 Betten hatte!

    Man stelle sich vor, hier für eine Management-Software eine Bitmaske aufstellen zu müssen die ALLE Kombinationen erschlägt, welche Passagierbetten z. Z. frei und welche belegt sind! 2 hoch 499 ist der Höchstwert! Da kommt doch Freude auf...
    Jetzt angenommen, die GMP-Extension gäbe es (noch) nicht, oder das soll auf einen bestehenden PHP4-Kundenserver, bei dem der Kunde nicht unbedingt begeistert wäre, wenn ich an seinem Server herumfummle...

    Dann ist das gar nicht so simpel, wenn man mit Checkboxen arbeitet, bei denen man sich bei Wertübergabe auf *EINEN* Wert pro Box beschränken muss.

    Ich hab mir das so gedacht:

    Ich splitte das Ganze zunächst in Gruppen auf.

    Also im QoS-Beispiel mit etwas weniger Betten (100):

    Oberdeck (24 B. [0..23] ; Gruppe 0, 24bit, voll)

    Poopdeck (18 B. [0..19]; Gruppe 1, 24bit, 6bit ungenutzt)

    Backdeck (16 B. [0..15]; Gruppe 2, 16bit, voll)

    Hauptdeck (30 B. [0..29]; Gruppe 3, 32bit, 2bit ungenutzt)

    Unterdeck (22 B. [0..21]; Gruppe 4, 24bit, 2bit ungenutzt)

    Durch diese Struktur wird die Bitmaske allein nun sinnlos, und sie muss immer mit einem sog. Gruppenschlüssel in Kombination stehen.
    Z. B. der Hex-Wert $0800 (binär 0000100000000000) kann sowohl das Bett Nr. 11 im Oberdeck als auch das im Backdeck bezeichnen!
    Das Ganze ist auch deswegen absolut notwendig, weil es möglich sein muss, gleichzeitig Klicks in verschiedene Decks zu machen, und damit auch mit einer Datenbankabfrage den Status bei allen "berührten" Decks abzufragen!
    Angenommen, die Decks sind untereinander aufgeteilt in Kompetenzbereiche. Dann macht der Schiffsangestellte A das Haupt- und Unterdeck, und der Schiffsangestellte B die anderen 3 Decks! Natürlich soll es auch möglich sein, dass die Kompetenzbereiche getrennt bleiben; d. h. dass der eine nicht im Bereich des anderen herumpfuschen können soll!


    Wie sieht so eine Checkboxen-Gruppe bei HTML aus? Bekanntlich doch so:

    Code:
    <input type="checkbox" name="belegung[]" value="4711">
    <input type="checkbox" name="belegung[]" value="4712">
    Aha. Also wir haben *EINEN* Wert, benötigen aber Bitmaske UND Gruppenschlüssel.
    Was definitiv geht ist etwas Mathematik:

    Code:
    <input type="checkbox" name="belegung[]" value="201">
    <input type="checkbox" name="belegung[]" value="201">
    D. h. ich errechne mir bei angeklickter Checkbox nachher im Script den Gruppenschlüssel bei ganzzahliger Division durch 100:

    groupkey_int = value_int / 100;

    Und mit "value & 1" kann ich sogar bei einer Dezimalzahl (!) ggf. prüfen, ob der 1er aktiv ist.
    (Simples Draufaddieren - und hinterher Subtrahieren - geht hier IMHO *nicht*: ein Wert von "3" könnte heißen "3 + 0", also Gruppe 3 - inaktiv, oder "2 + 1" Gruppe 2 - aktiv! Zu mehrdeutig!)

    Gibt es noch mehr Vorschläge?
    Zuletzt geändert von syntaxerror; 25.03.2010, 18:19.

  • #2
    Warum überhaupt Bitmasken? Wenn sich die Anzahl der Plätze/Betten/Wasweißich irgendwann mal ändert, musst du alles neu schreiben. Warum nicht einfach eine Boolean-Spalte in der Tabelle `platz` (oder `bett`) oder eine n:m-Tabelle, die gleich noch abbildet, welcher Platz für wen belegt/reserviert ist.
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Zitat von AmicaNoctis Beitrag anzeigen
      Warum überhaupt Bitmasken? Wenn sich die Anzahl der Plätze/Betten/Wasweißich irgendwann mal ändert, musst du alles neu schreiben.
      Hehe.
      So wie ich's in diesem konkreten Beispiel beschrieben hab, hast du schon recht.
      Allerdings wenn man sich hingegen da eine Raumbelegung hineindenkt, und dann z. B. sich verschiedene User immer wieder verschiedene i. d. R. gleichbleibende Gruppen Räume anzeigen lassen wollen (eben per solcher Checkbox-Filter) sieht die Sache u. U. wieder anders aus. Dann könnte man für jeden der User ganz praktisch so eine Maske abspeichern und dann ggf. wieder reinladen.

      In dem Fall müsste ich dann nur simple Hex-Werte abspeichern, das ist dann sehr platzsparend.
      Bei der Boolean-Lösung müsste ich das für jeden User explizit machen (weil individuell)...da bin ich noch am Überlegen, ob das nicht u. U. zuviel Datensätze verbrät...

      Kommentar


      • #4
        Eine vernünftig indizierte und normalisierte Datenbank kommt problemlos mit einer riesigen Menge an Datensätzen aus. Ich persönlich würde sowas jedenfalls niemals über Bitmasken machen.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          @syntaxerror
          Ich nutze ab und an solche Bitmasken um true/false-Werte abzuspeichern und zwar mit dem mySql-Datentyp SET - das ist im Prinzip nichts anderes als deine Bitmaske und du kannst jedem Bit praktisch einen Namen verpassen und kannst mittels FIND_IN_SET bequem danach suchen.

          Bei der Verwendung dieses Datentyp ist aber zu beachten, dass es diesen soweit ich weiß in keinem anderen SQL-Dialekt gibt - wenn du damit mal auf ein anderes DBMS willst, hast du es etwas unbequemer.

          Für deinen geschilderten Anwendungsfall ist aber unbedingt auf anderem Wege vorzugehen - du musst ja bei Belegungen auch noch das Datum berücksichtigen - wie willst du das mit einer Bitmaske vernünftig lösen?
          Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
          Schön - etwas Geschichte kann ja nicht schaden.
          Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

          Kommentar


          • #6
            Zugegeben ans Datum und wie das da reinkommt hab ich in dieser "Frühphase" noch nicht gedacht...

            Kommentar

            Lädt...
            X