Tabellen-Problem

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

  • Tabellen-Problem

    Hi!

    Also, ich hab folgendes Problem:
    Damit es einfacher verständlich ist, werde ich das Problem auf eine andere Thematik anwenden.
    In einem Forum gibt es ja Kategorien und Unterkategorien. Wenn ja jede Unterkategorie eine Kategorie hat, ist das ja kein Problem. Ich nehm einfach die Id als Verweis.
    Wie ist das dann wenn sich 2 Kategorien dieselbe Unterkategorie teilen?
    Geht das dann einfach so, dass ich in der Unterkategorietabelle eine Spalte anleg, wo ich die Ids der Kategorien angebe?

    Mein Lösungsvorschlag wäre:
    Ich schreib in der o.g. Spalte einfach so die Ids auf: 1;2;3
    und les dann die einzelnen Nummern über eine Stringfunktion aus.
    Ist das zu umständlich? Geht das geschickter?

  • #2
    Nein, besser ist es, Du legst jedesmal eine neue Tabelle an, die Du dann verknüpfen kannst, weil Du sonst redunate Daten erzeugst.

    Schau Dir einfach mal die 4 Normalformen von Datenbanken an.
    Ziel ist es, alle Daten nur einmal zu speichern und immer auf 1:n Verknüpfungen zu kommen.

    Gruß Maribel
    Zuletzt geändert von Maribel; 10.05.2008, 23:07.

    Kommentar


    • #3
      aber ich verknüpfe doch die Unterkategorie mit der Kategorie.
      In der Unterkategorie steht doch drin welche übergeordnete Kategorie ich habe.
      Ich versuchs mal anders zu schildern:
      Ein Automodell hat einen Motor. Dieses Motormodell wird aber auch in einem anderen Automodell verbaut.
      Dann hab ich ja eine Tabelle mimt Motoren und eine mit Automodellen.
      In der einen Spalte bei den Motoren stehen ja die Auto-IDs.
      Wie lös ich das jetzt? Ich habe ja hier zwei Auto-IDs stehen...
      EDIT: Was ist eine 1:n Tabelle?
      Zuletzt geändert von Speedyspin; 11.05.2008, 00:43.

      Kommentar


      • #4
        ich glaube du suchst nested joins?

        funktioniert wie folgt, und ist ähnlich zu deiner variante, aber nicht mit strings, weil strings möglichst nur zur speicherung von irgendwelchen text oder ähnlich dienen sollte und möglichst nicht in where oder joins!

        Ich würde die tabelle wie folgt ausbauen:

        [FONT=courier new]
        Tabelle:

        int id, varchar topic

        100000000, 'Forumsthreads'
        200000000, 'Gossip'
        300000000, 'Sonstiges'
        ...
        9900000000, 'letzte kategorie'

        101000000, 'ich bin direkt unter der kategorie forumsthread'
        199000000, 'ich die letzte kategorie direkt unter der kategorie forumsthread'
        201000000, 'und ich direkt unter Gossip'
        ...
        9901000000, 'erste kategorie unter der "letzten kategorie"'
        9999000000, 'letzte kategorie unter der "letzten kategorie"'

        101010000, 'ich bin in der dritten Ebene unter "Forumsthread" / "ich bin direkt unter der kategorie forumsthread"'
        ...
        9999999999, 'ich bin theoretisch die letzte kategorie, außer ich nutze "alle" int Werte'
        [/FONT]

        du musst hier halt einen kompromiss zwischen anzahl der ebenen und anzahl der kategorien in den Ebenen finden!

        wenn du unendlich ebenen haben willst, dann müsstest du das glaub ich mit binary statt int probieren und dann einen riesigen bereich allokieren.

        wenn dir das zu kompliziert ist, kannst du dich mal mit prozeduren befassen, oder du benutzt mehrere abfragen in PHP schleifen, aber am besten ist es, wenn sql nur einmal eine anfrage bekommt. Also nimm nested joins oder rekursive funktionen oder prozeduren (sorry kann grad nicht näher erklären, wie des unter sql läuft)!

        hoffe ich konnte dir helfen!

        greetz Flip
        Find Parties?
        Partysuche

        Kommentar


        • #5
          Man, da is ja meine Methode auch nich viel schlechter.
          Bei deiner müsste ich ja genauso die lange Zahl aufbröseln und schaun, zu welchem topic die gehört

          Kommentar


          • #6
            eine zahl mit modulo, geteilt oder sonst was "aufbröseln" braucht VIEL weniger zeit, also einen string zu verarbeiten!

            die zahl 8 = 2 * 2 * 2 = 3 Bit
            der text "8" = 1 Byte = 8 Bit

            die zahl 1073741824 = 2 ^30 = 30 Bit
            der text "1073741824" = 10 Byte = 10 * 8 Bit = 80 Bit

            wie du siehst verwendet meine methode ALLE möglichen kombinationen, während deine nur immer pro stelle 10 von 256 möglichen kombinationen verwendet!

            wie du siehst ist deine Methode (wenn du nicht alles ascii zeichen verwendest) unvorteilhaft! wenn du weißt, dass dein forum maximal 100 user auf einmal versorgen muss, dann ist das kein problem! aber bei 1000 leuten wirds schon schwieriger!

            Aber mach es wie du willst! Ist ja deine Serverperformace.

            greetz Flip
            Find Parties?
            Partysuche

            Kommentar


            • #7
              Man kann natürlich alles unnötig kompliziert machen.

              Der einfache Weg:
              - Eine Tabelle mit allen Kategorien (egal ob Unterkategorie oder sonst was)
              - Eine Tabelle, die für die Struktur der Kategorien zuständig ist

              Tabelle für Kategorien:

              Code:
               id  name
              --------------------
               1   Kategorie 1
               2   Kategorie 2
               3   Kategorie 3
               4   Kategorie 4
               5   Kategorie 5
              Tabelle für die Struktur (cat_id = ID der Kategorie):

              Code:
               id  parent_id  cat_id 
              -----------------------
               1   0          1
               2   1          2
               3   1          3
               4   0          4
               5   4          2
               6   4          5
              So kannst du die Kategorien so oft verwenden, wie du willst und ersparst dir den Blödsinn mit irgendwelchen schwindligen 10-stelligen Zahlencodes.

              Das ganze würde dann aufgebaut so aussehen:

              Code:
              - Kategorie 1
                  - Kategorie 2
                  - Kategorie 3
              
              - Kategorie 4
                  - Kategorie 2
                  - Kategorie 5
              Funktioniert über beliebig viele Ebenen und beliebig viele Kategorien.
              Zuletzt geändert von h3ll; 11.05.2008, 16:58.

              Kommentar


              • #8
                Die Lösung gefällt mir, danke!

                Kommentar


                • #9
                  Man kann natürlich alles unnötig kompliziert machen.
                  Man könnte sein Hirn auch mal einschalten um zu merken, das in keinem forum eine kategorie unterkategorie in verschieden ebenen ist!

                  außerdem würde mich mal der SQL Befehl interessieren, der keine simple SELECT anweisung wird!
                  Find Parties?
                  Partysuche

                  Kommentar


                  • #10
                    Original geschrieben von Flip7
                    Man könnte sein Hirn auch mal einschalten um zu merken, das in keinem forum eine kategorie unterkategorie in verschieden ebenen ist!
                    Das war nicht meine Idee sondern seine Anforderung. Wie wärs mal, wenn du dein eigenes Hirn einschaltest?

                    außerdem würde mich mal der SQL Befehl interessieren, der keine simple SELECT anweisung wird!
                    Ist ein simples LEFT JOIN. Und nein, ich bring dir jetzt nicht MySQL bei.
                    Zuletzt geändert von h3ll; 12.05.2008, 22:33.

                    Kommentar


                    • #11
                      Ich hab ehrlichgesagt keine Lust mich mit einem Gschaftler wie dir zu streiten.
                      Aber man muss ja nicht gleich die Lösungen anderer verurteilen!

                      Wie willst du dir eine komplette Hierachie ausgeben, wenn nicht nicht weißt, wieviele JOINS du brauchst?
                      Find Parties?
                      Partysuche

                      Kommentar


                      • #12
                        Man braucht nur einen LEFT JOIN. Die Hierarchie baut man sich anhand der parent_id mein einer foreach-Schleife zusammen.

                        Deine Lösung ist einfach nicht skalierbar und außerdem unnötig aufwändig.

                        Kommentar

                        Lädt...
                        X