Ankündigung

Einklappen
Keine Ankündigung bisher.

Tabellen-Design bei wirklich grossen Projekten

Einklappen

Neue Werbung 2019

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

  • Tabellen-Design bei wirklich grossen Projekten

    Ich beschäftige mich gerade mit Datenbankstrukturen bei grossen Projekten, also vor allem damit, wie man eine Unmenge an allen möglichen Informationen möglichst resourcenschonend und effektiv ablegen kann.

    Bisher habe ich eigentlich nur mySQL-Projekte verwirklicht, bei denen die Daten recht überschaubar und nicht allzu komplex waren. Und auch die Beispiele in den meisten Tutorials, Büchern etc. sind oft sehr simpel gehalten.

    Was mich aber zunehmend interessiert, ist, wie man mySQL auch recht komplexe Dinge umsetzen kann, bei denen die Daten z.B. in allerlei Querverbindungen zueinander stehen und wirklich VIELE Daten gehandelt werden.

    Ich habe mir zu Übungszwecken mal die Datenbankstruktur des phpBB-Forums angesehen (das ja auch mit recht vielen Einträgen zurechtkommt) und hier ist der Aufbau ja noch nachvollziehbar: es gibt eine Tabelle "Users" (pro Zeile ein Userprofil) und z.B. eine Tabelle "Threads" pro Zeile ein Thread, eine Tabelle "Posts", in der alle Beiträge des Forums stehen usw. Die grösste Tabelle ist hier ja noch jene, mit den einzelnen Beiträgen -aber selbst in grossen Foren kann mySQL die Anzahl an Einträgen ja noch recht gut handeln.

    Aber dann habe ich mir z.B. mal das Browsergame "Galaxywars" angesehen (eigentlich so das grösste DB-Projekt, das ich kenne) und versucht nachzuvollziehen, wie hier die Datenbank "designed" ist. Und da steige ich dann irgendwie aus.

    Jeder Benutzer (und es sind, soweit ich weiss, hunderttausende) kann dort ja 1-20 Planeten haben. Okay, Tabelle "Planeten", pro Zeile ein Planet mit UserID. Das gibt dann schon im schlimmsten Fall einige hunderttausend mal 20 Einträge. Mag vielleicht noch gehen.

    Was aber echt heftig ist: jeder User kann ja hunderte, wenn nicht tausende(!) von Schiffen bauen (ca. 10 verschiedene Schiffstypen oder so). Wie haben die das gelöst? Wenn es hier eine Tabelle "Schiffe" gibt, in der ALLE existierenden Schiffe (mit jeweiliger UserID des Besitzers) eingetragen werden, wird das doch mal schnell zur Monstertabelle mit weit über einer million Einträgen oder so.

    Bei z.B. 500.000 Nutzern mit jeweils 1000 Schiffen wären das ja bereits 500.000.000 Einträge in dieser Tabelle. Das wäre schon irgendwie heftig, oder?

  • #2
    Ich kenne die Datenbankstruktur von Galaxywars nicht. Nur das Spiel, hab es selber mal eine Zeit lang gespielt Aber es könnte sein das es zu jedem Schiffstyp eine Tabelle gib. 10 Schiffstypen = 10 Tabellen. Das würde die menge der Einträge pro Tabelle schon wesentlich verringern.

    Weißt Du welche DB dort eingesetzt wird?

    Kommentar


    • #3
      Hallo!

      Die größe der DB also was die Anzahl der Tabellen angeht ist eigentlich irrelevant!

      Wichtig ist das du auf die Normalisierung achtest und wenn Suchen in Anspruch genommen werden sollen oder es zu vielen Join Abfragen kommt und viele Order By Klauseln dann auf die nötige INDEX Vergabe an den Tabellen Feldern,dann ist die Größe der DB völlig uninteressant!

      Das wichtigste ist aber das deine Struktur im Kopf sehr gut durchdacht ist und nicht im Nachhinein viele Ergänzungen kommen,denn da kann es passieren das man schnell den Wald vor lauter Bäumen nicht sieht. Was heist das Projekt entsteht im Kopf,alles andere ist Programmcode Umsetzung.

      mfg der litter

      Kommentar


      • #4
        Ich habe schon des öfteren gelesen, weiß leider nicht mehr genau wo, das bei wirklich großen Projekten mit entsprechendem DB Traffic die Normalisierung vernachlässigt wird um die Performance zu verbessern. Wobei wirklich groß sicher relativ ist...

        Kommentar


        • #5
          Bei z.B. 500.000 Nutzern mit jeweils 1000 Schiffen wären das ja bereits 500.000.000 Einträge in dieser Tabelle. Das wäre schon irgendwie heftig, oder?
          Sicher besser als eine Tabellenzeile mit 1000 Schiffsfeldern.
          Das wichtigste ist aber das deine Struktur im Kopf sehr gut durchdacht ist
          [..]
          Was heist das Projekt entsteht im Kopf
          Besser entsteht das Projekt in einer geeigneten Modellierungssoftware. Dann hat man auch gleich einen Ansatz einer Dokumentation der DB Struktur.

          Kommentar


          • #6
            Speichern die wirklich jedes Schiff einzeln ab? Ich könnte mir vorstellen dass die eher Flotten abspeichern. Also Flotte xyz hat 400 Schiffe Typ A, 350 Schiffe Typ B, etc.

            Desweiteren hat Galaxywars ja mehrer "Universen". Also wird wohl nicht alles auf einem Server, sondern alles auf mehreren laufen. So teilt sich die Größe der Datenbank weiter auf.

            Kommentar


            • #7
              Man kann ja auch die komplette Datenbasis in einer einzelnen Tabellenzeile abspeichern. Das spart den WHERE-Teil der Abfrage, man muss nur vorausschauend planen und wissen, wie groß die Zeile mal werden kann und die jeweils benötigten Felder richtig SELECTen. (Wieder mal ein Punkt gegen SELECT *).

              SCNR

              Kommentar


              • #8
                Man kann ja auch die komplette Datenbasis in einer einzelnen Tabellenzeile abspeichern
                Das ist doch schon im Ansatz falsch.

                Kommentar


                • #9
                  Zitat von Pauli76
                  Weißt Du welche DB dort eingesetzt wird?
                  Soweit ich weiss mySQL -zumindest war das bei der Originalversion vor einigen Jahren noch sicher der Fall.


                  Zitat von Pauli76
                  Aber es könnte sein das es zu jedem Schiffstyp eine Tabelle gib. 10 Schiffstypen = 10 Tabellen. Das würde die menge der Einträge pro Tabelle schon wesentlich verringern.
                  Dachte ich mir auch schon -aber das würde dann auch ein ziemliches Hin- und Hergespringe zwischen Tabellen ergeben. Vor allem, weil man ja nach Belieben Flotten aus allen verschiedenen Schiffstypen zusammenstellen kann, die man hat, also diese auch jedesmal neu gruppieren kann. Da müssten also jedesmal 10 Tabellen durchforscht werden, um herauszufinden, welche Schiffe dem User gehören und welche davon in der selben Flotte fliegen.


                  Zitat von Flor1an
                  Speichern die wirklich jedes Schiff einzeln ab? Ich könnte mir vorstellen dass die eher Flotten abspeichern. Also Flotte xyz hat 400 Schiffe Typ A, 350 Schiffe Typ B, etc.
                  Joa, das habe ich mir auch schon überlegt. Wäre eine Möglichkeit. In einer Tabelle "Flotten" könnte man dann alle Gruppen von Schiffen zusammenfassen. Diese ändern sich zwar oft, weil der User nach Belieben eigene Flotten zusammenstellen kann, da aber eine Flotte oft 10-20 Schiffe enthält, würde das die Menge schon mal drastisch reduzieren.

                  Kommentar


                  • #10
                    Ob sich die Daten ändern oder nicht ist doch egal. Wenn alle Schiffe einzeln abgespeichert werden würden und 100 Schiffe zerstört werden müsstest du 100 Einträge löschen.

                    Wenn nur eine Flotte gespeichert wird muss nur eine Flotte geupdated werden und die Anzahl der Schiffe verändert werden ... geht wesentlich einfacher.

                    Kommentar


                    • #11
                      Zitat von nikosch Beitrag anzeigen
                      Das ist doch schon im Ansatz falsch.
                      Denk dir <ironie />-Tags, dann ist meine kleine Exkursion in die Abgründe individualistischen Datenbankdesigns besser zu verstehen

                      Kommentar

                      Lädt...
                      X