Ankündigung

Einklappen
Keine Ankündigung bisher.

ID auto_increment und sein Limit

Einklappen

Neue Werbung 2019

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

  • ID auto_increment und sein Limit

    Hallo zusammen,

    gleich hagelt es von "das gibt rendundanzen" "sowas macht man nicht" bla bla.
    Aber ich komme mal auf den Punkt. Ich brauche einen Insert der gelöschte, freigewordene IDs wiedernutzt. Was mir per PHP und selbstkontrolle ja möglich ist, aber ich wollte wissen ob es da eine Funktion gibt die sql anbietet.

    Eure Fragen vorweg -das ergibt doch chaos:
    Nein keine Sorge, beim löschen eines Eintrags werden alle Bezüge dessen, also alle Querverweise ebenso entfernt.

    Eure Fragen vorweg -wieso braucht er das:
    Ein Browserspiel hat täglich Ereignisse vom Spieler. Gehen wir von 30 aus.
    Jedes Ereignis hält zwischen 1 und 20 Tagen bis es erledigt (gelöscht) ist.
    Jetzt spinnen wir mal und haben 500.000 Gamer.
    Pro Tag 15.000.000 Einträge
    Pro Monat 450.000.000
    Der Integer bei 2 millrd. was mir schon etwas sorgen macht wenn das Spiel 3 Jahre alt wird und wir bei 16,2 Millarden Einträgen wären.

    Meine Frage an euch,
    soll ich auf den Big Int aufbauen, oder mein Vorhaben mit den ersetzbaren IDs umsetzen ?


    gruss marco


  • #2
    Warum willst du Bigint NICHT verwenden?
    Das ist nicht nur die bessere, sondern auch wesentlich einfachere Möglichkeit.

    Kommentar


    • #3
      Es macht keinen sinn Lösungen für nicht existente Probleme zu finden. "Pro Tag 15.000.000 Einträge" sind 173 Events/Inserts pro Sekunde. Das ist mit potenter Hardware kein Problem, aber wieviel Queries braucht es damit der User ein Event erzeugen kann oder wieviel Queries braucht es um ein Event zu verarbeiten? Da ist dann ganz schnell finster...
      Wenn du schon rumspinnst, spinn in einem realistischen Rahmen. Bei 500.000 aktiven Nutzern sind die Ids der Events nämlich dein kleinstes Problem.

      Kommentar


      • #4
        ID auto_increment und sein Limit

        Wenn dir Big Int nicht reicht kannst du immer noch eine UUID nehmen, dann sind wir bei 5*10^36. Ich habe keine Ahnung, was für -illionen ^36 sind.

        Btw, bis es soweit ist, solltest du dich um "andere Probleme" kümmern. Die Abzahl Events musst du erst einmal generieren und abfragen können. Dazu braucht es die Hardware und auch die optimierten Queries. Bis du das alles hast, dauert es auch ein bisschen.
        GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

        Kommentar


        • #5
          Zitat von izanagi Beitrag anzeigen
          beim löschen eines Eintrags werden alle Bezüge dessen, also alle Querverweise ebenso entfernt.
          Google mal nach "fremdschlüsselbeziehung" und/oder "referentielle integrität"
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            Vielen Dank für die ausschlußreichen Gedanken eurerseits, das macht Sinn was ihr sagt, deswegen werde ich mich mit dem bigInt anfreunden.

            Zu den Events nochmal kurz, es gibt verschiedene Transaktionen wie Handel von A nach B, Angriff von A nach B, Transport von A nach B
            alles wo zwei Parteien nötig sind. Da die Events meist einige Stunden oder Tage zum Abschluß benötigen... werden sie in die DB zwischengespeichert mit allen wichtigen Werten die vorher gewählt wurden. Nach erreichen der Zeit, sobald der User sich einloggt, wird der Event ausgeführt. Oder es wird auf Antwort des Ziels gewartet, und erst dann ausgeführt. Das Event besteht also einige Tage in der DB.
            Kleinere Events wie das Bauen und Updaten werden hingegen als Array beim Spieler selbst zwischengespeichert und abgearbeitet. Sonst wäre das wirklich zuviel für die Tabelle. Da lässt sich ein Array besser speichern.

            Macht es eigentlich Sinn einige Teile in eine XML auszulagern und diese zu ergänzen ? Das lesen und schreiben von Dateien ist nur langsamer soweit ich weiss.
            Weil ich würde gerne die Missionen und das Leveling in XML packen um flexibler neue Einträge zu erstellen.
            So kommen neue Ingame Missionen einfach per XML Datei Update. Theoretisch könnte ich noch viel in XML auslagern.
            Feste vorgaben wie Klassensysteme, Personenbasiswerte, Gebäudeinformationen. Aber ich weiss nicht wie sicher Dateien gegen Manipulationsversuche sind.
            Aber die Datenbank auszulasten wäre vielleicht hier ein Ansatz oder ?


            @rkr reicht hier "on delete set null" schon aus um alle Beziehungen zu killen ? Eigentlich wollte ich das händisch per PHP machen. Wobei ich hier sagen muss, das diese Events wirklich keinen gravierenden Einfluss auf die Datenbankstruktur haben. Sobald es abgeschlossen ist, existiert es nicht mehr und wird nie wieder benötigt. Aber um den Regeln Willens, halte ich mich daran.

            @erc ich bin ein Vorausplaner daher meine Sorge um noch nicht existierende Probleme. Da werden auch noch vieeele weitere Fragezeichen auf mich zukommen, wie die die du schon angesprochen hast

            Kommentar


            • #7
              Der Klassiker ist CASCADE. Dadurch werden alle Referenzen automatisch gelöscht.
              Standards - Best Practices - AwesomePHP - Guideline für WebApps

              Kommentar


              • #8
                Du kannst sicherlich sehr viel in XML auslagern. Dann stellt sich mir jedoch die Frage, wieso du eine relationelle Datenbank als Basis nimmst. Auch habe ich es gar nicht gerne, serialisierte Arrays in einer Datenbank zu speichern. Dafür ist eine Datenbank einfach nicht da.

                Eventuell bist du mit einer NoSQL-Datenbank viel besser bedient. Die hat dann wirklich keine Probleme, mehrere Milliarden Rows zu verarbeiten. Die ist dafür geschaffen.

                Sobald du in einem RDMS einige Daten auslagerst (in XML, ...) gefährdest du die Integrität der gespeicherten Daten (es fehlen die Relationen dazu). Dann kannst du das ganze Spiel mit den Beziehungen auch gleich sein lassen und komplett auf XML umsteigen.

                Zudem verstehe ich nicht wieso es einfacher sein sollte, mittels XML In-Game-Missionen einzuspielen als dieselbe Information in eine Datenbank einzufügen.
                GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                Kommentar


                • #9
                  Zitat von ChristianK Beitrag anzeigen
                  Du kannst sicherlich sehr viel in XML auslagern. Dann stellt sich mir jedoch die Frage, wieso du eine relationelle Datenbank als Basis nimmst. Auch habe ich es gar nicht gerne, serialisierte Arrays in einer Datenbank zu speichern. Dafür ist eine Datenbank einfach nicht da.

                  Eventuell bist du mit einer NoSQL-Datenbank viel besser bedient. Die hat dann wirklich keine Probleme, mehrere Milliarden Rows zu verarbeiten. Die ist dafür geschaffen.
                  Oder sowas : http://talks.bitexpert.de/unkonf2014-postgres-nosql/#/ Da hat man beide Welten unter einem Dach.
                  PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                  Kommentar


                  • #10
                    Ja deshalb frage ich euch das auch Weil ich mir nicht ganz sicher war mit der Performence da fehlt mir die Erfahrung.
                    Die XML ist ein alter Freund aus Flash Zeiten von mir, da haben wir eigene Leveleditoren und Missionseditoren gebaut um dann als Interaktives Programm neue Missionen und Levels zu bauen, die dann als XML abgespeichert werden und im Spiel selbst dann wieder als XML eingelesen werden.
                    Ich dachte ich könne mir solch ein Editor wieder programmieren und dann fürs Browsergame nutzen. Aber ich sprach gerade mit meinem Bruder der mir das selbe sagte wie Ihr gerade, das macht wenig Sinn wenn man schon sowieso eine Datenbank nutzt.

                    Kommentar


                    • #11
                      Ich habe noch eine wichtige Frage, aus dem Contao Framework kenne ich das Arrays in einem BLOB gespeichert werden, bekomme ich hier auch gut umgesetzt.
                      Aber im Netz finde ich immer nur das Speichern im vchar. Jetzt versuche ich herauszufinden welcher Typ mehr Speicher benötigt. Es hakt aber bereits... Ich bekomm die Ausgabe vom vchar nicht wieder zusammgeflickt zu einem Array obwohl es vorher escaped+serialisiert und später wieder deSerialisiert wurde.

                      Kommentar


                      • #12
                        Wenn ich varchar lese: Kann es sein, dass der Inhalt einfach nur abgeschnitten wird, weil varchar eine max. Länge hat?
                        Standards - Best Practices - AwesomePHP - Guideline für WebApps

                        Kommentar


                        • #13
                          Bei MySQL wird's wohl so sein, TEXT ist auch begrenz, genau so wie LONGTEXT (& co). Bei PG wird es sicher eine Fehlermeldung werfen.
                          GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                          Kommentar


                          • #14
                            Zitat von izanagi Beitrag anzeigen
                            Macht es eigentlich Sinn einige Teile in eine XML auszulagern und diese zu ergänzen ? Das lesen und schreiben von Dateien ist nur langsamer soweit ich weiss.
                            Weil ich würde gerne die Missionen und das Leveling in XML packen um flexibler neue Einträge zu erstellen.
                            So kommen neue Ingame Missionen einfach per XML Datei Update. Theoretisch könnte ich noch viel in XML auslagern.
                            Feste vorgaben wie Klassensysteme, Personenbasiswerte, Gebäudeinformationen. Aber ich weiss nicht wie sicher Dateien gegen Manipulationsversuche sind.
                            Aber die Datenbank auszulasten wäre vielleicht hier ein Ansatz oder ?
                            Natürlich kannst du die Konfiguration in XML Dateien ablegen. Dabei ergibt sich aber der Nachteil, dass du diese Daten nicht einfach in SQL Queries verwenden kannst.

                            Zitat von izanagi Beitrag anzeigen
                            @erc ich bin ein Vorausplaner daher meine Sorge um noch nicht existierende Probleme.
                            Seh ich, das Eingangsposting gibt mir eine gute Vorstellung von deiner "Planung".

                            Kommentar


                            • #15
                              Zitat von erc Beitrag anzeigen
                              Natürlich kannst du die Konfiguration in XML Dateien ablegen. Dabei ergibt sich aber der Nachteil, dass du diese Daten nicht einfach in SQL Queries verwenden kannst.
                              Hm. Doch kann man.
                              PHP-Code:
                              /* mysql */
                              SELECT EXTRACTVALUE('<root><some><xpath><node>Heureka</node></xpath></some></root>''/*/some/xpath/node'
                              Sollte man?
                              Hach, ich weiss nicht...
                              Standards - Best Practices - AwesomePHP - Guideline für WebApps

                              Kommentar

                              Lädt...
                              X