Ankündigung

Einklappen
Keine Ankündigung bisher.

Db Struktur der Gebäude

Einklappen

Neue Werbung 2019

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

  • Db Struktur der Gebäude

    Hallo
    ich habe meine DB Struktur wie folgt für die gebäude aufgebaut:

    id | infotext | rohstoffformel | name | produziert | kosten | bedingungen | epoche | typ | pos | maxlevel

    In der Spalte kosten steht zb sowas: Holz|$level*20*$level;Eisen|$level*50*$level

    In Bedingungen:
    Holzfaellerhuette|3;Haupthaus|0


    Das Problem hierbei ist, ich muss eben alle gebäude abfragen um wie bedingungen zu wissen

    Wüsstet ihr eine Besser Lösung?

    mfg

  • #2
    Ja. Eine mit mehreren Tabellen.

    Kommentar


    • #3
      Hallo,
      ich geh mal davon aus, das brauchts du für ein Browsergame??

      Naja, ich würds wie folgt machen:;

      -Die Kosten würde ich mit einer formel(so wie du) berechenen und nur den Wachstumsfaktor angeben...so in etwa: '20:50:34'

      -Die Bedingungen sind etwas komplizierter, aber ich glaub das könntest du mit je einer Tabelle für jedes Gebäude lösen. Also dem Gebäude mit der id '1' ist eine Tabelle zugeordnet die dann pro Level die jeweiligen Bedingungen enthält. Ungefähr wie folgt aufgebaut:

      Level | Gebäudename(oder id) 1 | id 2 | id 3 | ...



      So in etwa würde ich das machen, aber wie dus nun schlussendlich machst, musst du allein entscheiden.

      Gemouen


      EDIT: nikosch war schneller ^^... hoffe aber, dass meine infos tzm hilfreich sind

      Kommentar


      • #4
        Zitat von Gemouen Beitrag anzeigen
        Hallo,
        ich geh mal davon aus, das brauchts du für ein Browsergame??

        Naja, ich würds wie folgt machen:;

        -Die Kosten würde ich mit einer formel(so wie du) berechenen und nur den Wachstumsfaktor angeben...so in etwa: '20:50:34'

        -Die Bedingungen sind etwas komplizierter, aber ich glaub das könntest du mit je einer Tabelle für jedes Gebäude lösen. Also dem Gebäude mit der id '1' ist eine Tabelle zugeordnet die dann pro Level die jeweiligen Bedingungen enthält. Ungefähr wie folgt aufgebaut:

        Level | Gebäudename(oder id) 1 | id 2 | id 3 | ...



        So in etwa würde ich das machen, aber wie dus nun schlussendlich machst, musst du allein entscheiden.

        Gemouen


        EDIT: nikosch war schneller ^^... hoffe aber, dass meine infos tzm hilfreich sind

        sry hab ich nicht verstanden kansnt mir die gebäude tabelle hinschreiben mit einer beispiel zeile?
        wie du meinst für jedes gebäude eine tabelle Oo 50 tabellen nice

        BILD: http://www9.picfront.org/picture/Xu9em0x0Wd/img/a.png

        Kommentar


        • #5
          Warum stellst Du diese Frage nicht im Datenbank-Forum?


          Nun zum Thema:

          Evtl. wird es Dir klarer, wenn Du versucht es etwas abstrakter zu betrachten:

          Mal ganz Einfach gesprochen:

          Tabellen sind ein Satz von gleichartigen Informationen
          Zeilen sind ein Satz zusammenhängender Informationen
          Zellen enthalten EINE spezielle Information

          Falls Du an eine Punkt kommst, wo eine Zelle mehrere Informationen enthalten muss, benötigst Du eine neue Tabelle.

          Ich würde das ganze wohl so bauen:

          1. tblGebaudearten
          - id
          - Bezeichnung
          - ...

          2. tblGebaudeKosten
          - id
          - idtblGebaudearten
          - idtblRohstoffe
          - idtblLevel
          - kosten

          Über dieses Konstrukt, kannst Du zu jedem Gebäude, in jedem Level, für jeden Rohstoff die Kosten abfragen und kannst auch jederzeit neue Rohstoffe, neue Level und neue Gebaudearten hinzufügen.

          Falls Dir das nicht weiterhilft, würde ich Dir DRINGEND empfehlen dich ZUERST ein paar Wochen mit dem Thema DB-Design auseinanderzusetzen, bevor Du dich an das Spiel setzt. Es kann sehr frustrierend sein, viele Stunden zu investieren, um am ende Festzustellen, dass Du bestimmte Fragestellungen mit Deiner DB überhaupt nicht abbilden kannst. Ich finde den Ausspruch "broken by design" ganz nett für soetwas. Und aufgrund Deiner Tabellenbezeichnungen und der Aussage, dass Du bei 60 Tabellen schon oje schreist, befürchte Ich, dass Du genau auf dem Weg in eine solche Situation bist.

          Kommentar


          • #6
            Arg nein ich hab ja auch nen Link rein, aber ich würde nicht wie vorgeschlagen für jedes gebäude eine tabelle machen

            jow so wie du hab ich es auch vor und noch mit bedingungen
            Allerdings gibts bei mir da ein Programmiertechnisches Problem

            Meine Abfrage sieht bis jetzt wie folgt aus
            [PHP$gebaudeforschung = $db->query("SELECT a.kosten, a.name, a.bedingungen, a.typ, b.value, b.gebaudeforschung FROM gebaudeforschungen AS a LEFT OUTER JOIN gebaudeforschungen_value AS b ON a.id = b.gebaudeforschung_id AND b.staedte_id = '$stadt' AND b.user_id = '$user_id' WHERE epoche LIKE '".$epoche."' ORDER by a.pos ASC");][/PHP]

            Da frag ich ja das Value aus eine anderen Tabelle ab das geht auch weil in der anderen Tabelle nur ein eintrag für das gebäude stehen kann, bei bedingungen oder kosten können dann dort mehr einträge sein , wie werte ich die dann aus?


            bis jetzt werte ich so aus:
            PHP-Code:
            while ($gebaudeforschung1 mysql_fetch_array($gebaudeforschung)) {
            $name $gebaudeforschung1["name"];
            $value$gebaudeforschung1["value"]; 
            aber nun müsste ich ja noch ein array bekommen also so:
            PHP-Code:
            while ($gebaudeforschung1 mysql_fetch_array($gebaudeforschung)) {
             
            $name $gebaudeforschung1["name"];
             
            $value$gebaudeforschung1["value"];
            $kosten $gebaudeforschung1["kosten"]; array oder sonst was wo eben mehr zeilen drinstehen ergebnisse aus net nur einer zeile 

            Kommentar


            • #7
              Zitat von AxxelG Beitrag anzeigen
              Tabellen sind ein Satz von gleichartigen Informationen
              Zeilen sind ein Satz zusammenhängender Informationen
              Zellen enthalten EINE spezielle Information

              Falls Du an eine Punkt kommst, wo eine Zelle mehrere Informationen enthalten muss, benötigst Du eine neue Tabelle.
              Muss nicht unbedingt eine neue Tabelle sein. Wenn die Daten in einer Spalte nicht atomar sind, also verschiedene Werte des selben Types in der Spalte stehen ({1,2,3}) dann erfüllt das keine Normalform für Datenbanken. Das Problem kannste dann so lösen dass du eben mehrere Einträge machst ... und zwar halt einmal mit 1, einen mit 2 und einen mit 3. Dann liegt wenigstens die Normalform 1 vor. Wenn passt dann aber immer noch nicht so gut. Daher sollte das Tabellendesign dann noch in Normalform 3 gebracht werden. Damit sollte dann eigentlich ein schönes Tabellenschema existieren.

              Kommentar


              • #8
                1. Versuch doch bitte Dich zumindest grob an der deutschen Sprache zu orientieren, das Leses ist mir sonst zu anstrengend.

                2. Das ist kein "Programmiertechnisches Problem" das liegt an der Tatsache, dass nun einmal für ein Gebäude Kosten für mehrere Ressourcen entstehen.

                Zu dem Rest kann ich leider nichts sagen, da ich Deine Tabellenstruktur nicht verstehe.

                @Flor1an: Ich denke, dass für diesen Thread eine einfach Faustregel ausreichen sollte

                Kommentar


                • #9
                  Okay Entschuldige wegen der Rechtschreibung und Grammatik.

                  Also hab ich es nun richtig verstanden:
                  Ich soll Bedingungen und Kosten (sind ja ähnlich vom Aufbau) in 2 Tabellen auslagern, nicht da das schneller ist sondern so eine Normalform entsteht?

                  Gut aber dann weis ich mit meinen Wissen nicht wie ich dann die Werte aus den neuen Tabellen auslesen soll wenn ich von dort mehr Zeilen haben möchte.

                  Ich weis nur wie ich eine Zeile via Join von einer 2. Tabelle verwenden kann(wie es bei mir mit den Values ist)

                  mfg Dominik

                  Kommentar


                  • #10
                    Ich halte mich mal an mein Beispiel von oben und geh davon aus, dass ich herausfinden möchte, wie "teuer" die nächste Stufe meines Gebäudetyps ist:

                    PHP-Code:
                    $gebaude mysql_fetch_array(SELECT idlevel, ... FROM tblGebaudearten);
                    $gebaudeKosten mysql_fetch_array(SELECT FROM tblGebaudeKosten 
                        WHERE 
                    (idtblGebaude $gebaude['id']) 
                        AND 
                        (
                    idtblLevel $gebaude['level']+1)); 
                    Der Code ist natürlich nur eine grobe schematische Darstellung

                    Du kannst dann mit $gebaudeKosten['Holz'] an die "Holzkosten" kommen.

                    Du must die Tabellen nicht unbedingt bei der Abfrage verknüfen, wenn Du keine Fragestellung hast, die eine verknüpfte Betrachtung erfordert.

                    Ewas anderes wäre die Frage, in welchen Gebäudetypen wir Holz benötigt, dass ist eine Frage, die eine Verknüpfung erfordert. Oder falls Du die Summe der Holzkosten für mehrere Gebäudetypen bilden möchtest, oder ...

                    Kommentar


                    • #11
                      Ähm mom mal da brauch ich ja für jedes gebäude einen query Oo?


                      Also schau mal so hab ich das wenn dann gedacht:

                      gebaude_rohstoffe
                      - geb_id // gebäudeid
                      - rohstoff // rohstoffid bzw name zb Holz
                      - formel // zb $level * 40 * $level


                      Dann könnte ich das so machen:

                      PHP-Code:
                      $gebaudeforschung $db->query("SELECT  a.name, a.bedingungen, a.typ, b.value, b.gebaudeforschung, c.values FROM gebaudeforschungen AS a LEFT OUTER JOIN gebaudeforschungen_value AS b  ON a.id = b.gebaudeforschung_id AND  b.staedte_id = '$stadt'  AND b.user_id = '$user_id' LEFT JOIN gebaudeforschungen_bedingungen AS c  ON a.id = c.id WHERE epoche LIKE '".$epoche."' ORDER by a.pos ASC");
                      while (
                      $gebaudeforschung1 mysql_fetch_array($gebaudeforschung)) {
                      $name $gebaudeforschung1["name"];
                      $id $gebaudeforschung1["id"];

                      $gebaudeforschung $db->query("SELECT * gebaude_rohstoffe WHere geb_id = $id



                      So würde ich es machen aber eben nicht den Query in dem Query sonst hab ich bei 100 Gebäuden vllt 300 Querys .

                      Also will ich das eben nun über einen Join machen.
                      Falls das noch nicht klar ist, das ist die Abfrage wenn ich alle Gebäude sehen möchte

                      mfg

                      Kommentar


                      • #12
                        Wenn Du die Rohstoffkosten für MEHRERE Gebäude auf einmal haben möchtest, ist auch der Join wieder das richtige Mittel.

                        Auf den ersten Blick sieht das doch schon ganz gut aus. Ob Du die Berechnungsformel noch in eine eigene Tabelle packst, ist Ansichtssache.

                        Für deine Abfrage könntest Du Dich noch mit Prepared Statments auseinandersetzen, ich kann mir vorstellen, dass sich das bei ein paar hundert Abfragen schon bemerkbar macht. Ich selbst habe die Varianten aber noch nicht verglichen.

                        Kommentar


                        • #13
                          Wir reden aneinander vorbei, sowie es nun ist, ist doch ein Query in dem anderen Query das ist ja FATAL

                          mfg

                          Kommentar


                          • #14
                            Willst du wirklich 100 Gebäude mit jeweils den ganzen Voraussetzungen auslesen und anzeigen??

                            Mach es so dass du halt nen JOIN bastelst und dann per Gruppenbruch (siehe unsere Wiki) diese Sachen anzeigen lässt.
                            Oder du schreibst dir 2 Querys, einen für die Gebäude, einen für die Voraussetzungen. Du liest alle Voraussetzungen ein, packst sie in ein Array und wenn du dann die Gebäude anzeigst kannste einfach anhand des Arrays nachschlagen welche Voraussetzungen noch dafür nötig sind. Das Array sollte dann halt so aussehen:

                            Code:
                            Array (
                                [0] => Array (
                                    [0] => 'Voraussetzung A',
                                    [1] => 'Voraussetzung B'
                                ),
                                [1] => Array (
                                    [0] => 'Voraussetzung A',
                                    [1] => 'Voraussetzung C'
                                )
                            )
                            Wobei der Indexe der ersten ebene genau die der Gebäude sind für welche die Voraussetzungen gelten.

                            Kommentar


                            • #15
                              Mein Traum wäre folgender:
                              Ein Query zu machen der alle Gebäude ausließt wo die Bedingungen zutreffen, aber da ist das Problem eben das ich ja nicht weis ob die Bedinugen stimmen ohne das ich alle Gebäude abgefragt habe

                              @Flo klar könnte ich nur die Bedingungen auslesen, dann habe ich sagen wir 100 Bedingungen, diese Speicher ich in Arrays, dann müsste ich aber noch alle Levels abfragen und dann noch alle Gebäude..Also ich glaube nicht das es gut ist oder?


                              EDIT: Also geht das nicht wenn ich sowas habe
                              PHP-Code:
                              SELECT A.EineSpalteB.EineAndereSpalte   
                              FROM Tabelle1 
                              AS A JOIN Tabelle2 AS B       
                              ON A
                              .EinWert B.EinAndererWert
                              und die Tabelle2 mehr Zeilen hat das ich diese in der While dann mit auslese?

                              mfg

                              Kommentar

                              Lädt...
                              X