Peter H.: Folgendes Datenbankmodell okay?

Hallo,

1. ich habe eine Seite mit den Bereichen
z.b.:

Boards, Cooleseiten, uncooleseiten, tolleseiten, untolleseiten

2. Jeder dieser Bereiche hat ne eigene Tabelle mit vielen Internetseiten.

3. Jede Seite hat bestimmte Themen(kann mehrere haben)

4. jede seite hat eine Bewertung die sich errechnet durch   "Bewertungswert /(durch) Anzahl-der-Bewertungen" also wenn jemand einer Seite eine 10(man kann von 1-10 wählen) gibt dann wird bewertungswert=bewertungswert+10 gerechnet und Anzahl-der-Bewertungen=Anzahl-der-Bewertungen+1 ..

5. es wird gezählt wie oft jemand von meiner seite aus auf einen der links klickt.

nun hab ich das alles so unterteilt:
der wert "id" ist in jeder tabelle "auto_increment"..

1. Tabelle (Seiten-Bereiche)
id bereiche
0  Boards
1  Cooleseiten
2  uncooleseiten
3  tolleseiten
4  untolleseiten
...

2./3./4./5./6. Tabelle ( für jeden bereich eine tabelle)
id boards (weitere spalten mit anderen infos)...
0  link
1  link
2  link
4  link
...

7. Tabelle ( Themen )
id thema
0  thema 1
1  thema 2
2  thema 3
3  thema 4
4  thema 5
...

So nun sollen aus diesen Tabellen die anderen Tabellen mit ihren IDs zsm "arbeiten" und ich will nachher mit Joins darauf zugreifen.

Beispiel 1 Bewertungen:

8. Tabelle (Bewertungen)
id bereich seite anzahl-der-bewertungen bewertungswert
0  2       1     9                      90

* Heißt dann das dass bewertungs id 0 ist mit der seite 1 aus dem bereich 2(uncooleseiten) und die durchschnittliche Bewertungszahl (bewertungswert/anzahl-der-bewertungen) = 10 ist!

Beispiel 2 "Ausgänge" (wie oft hat jmd auf den Link geklickt)
id bereich seite outgoes
0  0       0     0

** Heißt das ist Ausgangs-Id 0 über die Seite 0 aus Bereich 0 (Boards) mit 0 Ausgängen

Beispiel 3 "Themen und Seiten"
id thema seite bereich
0  1     2     3
1  49    2     3
2  99    2     2
3  122   2     2
4  2     1     1
5  1     3     4
5  2     3     4

*** Heißt das:
Seite 2 aus Bereich 3(tolleseiten) hat die themen 1 und 49
Seite 2 aus Bereich 2(uncooleseiten) hat die themen 99  und 122
Seite 1 aus Bereich 1(cooleseiten) hat das thema 2
Seite 3 aus Bereich 4(untolleseiten)hat auch thema 2 und auch thema 1

Wie realisiere ich das am besten, wäre nett wenn mir jemand für *, ** oder *** mal eine SQL-Abfrage schreiben könnte nur damit ich mit den Joins mal ein anwendungsbezogenes Beispiel für meinen Fall habe.

Gibts Verbesserungsvorschläge?

Danke

Liebe Grüße

Peter H.

  1. Hallo auch ;)

    ok hat en moment gedauert bis ich des richtig verstanden habe...

    also ich als angehender AE würde die tabellen so machen:

    1. Bereiche
    ID | Bereich
    1  | Boards
    2  | Cooleseiten
    ...

    2. Themen
    ID | Thema
    1  | Pokemon
    2  | PHP-Tut
    3  | Suchamachinen
    ...

    3. Seiten
    ID | Seitenname | Link | Bereich | Anzahl_Bewertung | Bewerdung_Gesamt | Ausgänge
    1  | Google     | URL  | 2       | 1337             | 1339         | 99
    ...

    4. Themen_Seite
    ID | Seiten_ID | Thema_ID
    1  | 1         | 3

    dann isses mit den joints nit so schwer ;) aber naja geht beides...
    (tipp: wir nehmen für joins die wir nicht so können MS access und ziehn die uns so zusammen wie wir mögen)

    der join für "Seitenname" - "thema" wäre ca:

    SELECT Seiten.Seitenname, themen.thema
    FROM Seiten INNER JOIN (Themen INNER JOIN themen_seite ON themen.ID = themen_seite.Thema_id) ON seiten.ID = themen_seite.seiten_id
    WHERE Seiten.Seitenname="google";

    naja ich irre mich bestimmt aber naja ich glaub so wäre der komplizierte join wenn man des in einem machen möchte^^

    gruß Sascha

    1. SELECT Seiten.Seitenname, themen.thema
      FROM Seiten INNER JOIN (Themen INNER JOIN themen_seite ON themen.ID = themen_seite.Thema_id) ON seiten.ID = themen_seite.seiten_id
      WHERE Seiten.Seitenname="google";

      Okay das heißt praktisch,
      nehme den "Seitennamen" und dessen Themen aus der Tabelle "Seiten"
      1. nehme aus "Themen" alle Themen die in "Themen_Seite" mit der "seiten_id" der Seiten.id gleich der Seiten.id wo der Name der Seite "google" ist...
      2. Nehme den Seitennamen aus "Seiten" wo der Name "google" ist..
      richtig?

      omfg, Peter

      1. wenn ich das jetzt richtig verstehe ja^^

        sage wir mal so suche alle seiten ids mit den seiten namen "google" aus der tabelle Seiten finde dazu in Thema_seie die dazugehörige themen_id und suche für diese dann die Themenbezeichnung...

        in php könnte man des auch in 2 einfacherer anweisungen schreiben...
        das der erst alle seitennamen + id sucht

        dann 2. anweisung suche zu den ids die themen id

        3 anweisung suche zu den themen ids die bezeichnung/ den text whatever raus...

        (wenn mans gans ausführlich und einfacher möchte ;)  )

        gruß Sascha

        1. Hm..

          danke ^^.. ich werds mal mit Joins Probieren,

          hast du oder noch jemand anderes noch weitere Vorschläge?

          Lg

          Peda

          1. Also,
            ich hab nun folgendes:

            1. Tabelle "bewertungen"
            anzahl-der-bewertungen  bewertungswert seite bereich
            10                      90             1     1

            2. Tabelle "bereiche"
            id bereich
            1  cooleseiten

            3. Tabelle "cooleseiten"
            id name-der-seite
            1  selhtml.de

            Ich möchte nun die Bewertung von Seite "selfhtml.de" haben aus "cooleseiten".

            Wie stelle ich das an? Ich komme einfach nicht drauf...

            "SELECT anzahl-der-bewertungen, bewertungswert
            FROM bewertungen
            WHERE bewertungen.bereich=bereiche.id
            ( INNER JOIN cooleseiten ON cooleseiten.id =
            ( INNER JOIN cooleseiten ON cooleseiten.name-der-seite='selfhtml.de')
            ) AND bewertungen.seite = (INNER JOIN cooleseiten ON cooleseiten.id WHERE name-der-seite='selfhtml.de')";

            Das kann es ja nicht seine.. =(...

            Lg

            Peter

            1. Also,
              ich hab nun folgendes:

              1. Tabelle "bewertungen"
                anzahl-der-bewertungen  bewertungswert seite bereich
                10                      90             1     1

              2. Tabelle "bereiche"
                id bereich
                1  cooleseiten

              3. Tabelle "cooleseiten"
                id name-der-seite
                1  selhtml.de

              ich glaub immernochnicht das du damit glücklich wirst aber naja...

              Ich möchte nun die Bewertung von Seite "selfhtml.de" haben aus "cooleseiten".

              Wie stelle ich das an? Ich komme einfach nicht drauf...

              SELECT cooleseiten.name, bewertungen.anzahl, bewertungen.summe
              FROM bewertungen INNER JOIN cooleseiten ON bewertungen.seite = cooleseiten.id
              WHERE (cooleseiten.name="selfhtml");

              so in etwa wenn ich mich nich irre^^ nur die tabellen und spalten sind bei mir anders benannt...

            2. Mahlzeit,

              1. Tabelle "bereiche"
                id bereich
                1  cooleseiten

              2. Tabelle "cooleseiten"
                id name-der-seite
                1  selhtml.de

              Entschuldige, wenn ich mich nochmal einmische ... aber pro Eintrag in der Tabelle "Bereiche" eine eigene Tabelle mit den jeweiligen Seiten zu diesem Bereich anzulegen ist ziemlicher Schwachsinn und absolut nicht wartbar - was willst Du z.B. machen, wenn vielleicht irgendwann mal ein neuer Bereich dazukommt oder Du einen vorhandenen Bereich herausnehmen willst? Tabellen neu anlegen bzw. löschen und ALLE SQL-Abfragen anpassen?

              Sinnvoller wäre:

              • eine Tabelle "Bereiche" und eine Tabelle "Seiten", wobei in letzterer eine Spalte "BereicheID" (o.ä.) existiert, so dass bei jeder Seite steht, zu welchem Bereich sie gehört

              oder

              • eine Tabelle "Bereiche", eine Tabelle "Seiten" und eine Zuordnungstabelle "SeitenBereiche", die außer ihrer eigenen ID nur zwei Spalten für "BereicheID" und "SeitenID" enthält, so dass jede Seite auch verschiedenen Bereichen zugeordnet werden kann

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
              1. Also ich werd mal genau sagen wie die Tabellen heißen und was drin steht:

                "boards"
                id seitenname link anmeldungnoetig kostenlos altersbegrenzung
                "internetchats"
                id seitenname link anmeldungnoetig kostenlos altersbregrenzung

                "chatclienten"
                id client version von kann logo link kostenlos
                "ircclienten"
                id client version von kann logo link kostenlos

                Alle haben dann noch Anz_Bew und Bew als spalte..

                Diese will ich auslagern. Wie ihr seht sind die Spalten bei boards und internetchats gleich. Bei Chatclienten und IRCclienten auch.

                Aber es sind nicht alle 4 gleich, deswegen pack ich die nicht alle in eine Tabelle ;) ..

                Damti fällt diese Methode schonmal weg:

                • eine Tabelle "Bereiche" und eine Tabelle "Seiten", wobei in letzterer eine Spalte "BereicheID" (o.ä.) existiert, so dass bei jeder Seite steht, zu welchem Bereich sie gehört

                Also habe ich jetzt folgende Methode genommen:

                • eine Tabelle "Bereiche", eine Tabelle "Seiten" und eine Zuordnungstabelle "SeitenBereiche", die außer ihrer eigenen ID nur zwei Spalten für "BereicheID" und "SeitenID" enthält, so dass jede Seite auch verschiedenen Bereichen zugeordnet werden kann

                Tabelle:
                "client_or_site_and_bereiche"
                id seitenid bereichid
                0  0        1
                1  0        2
                2  2        0
                3  5        3
                "bereiche"
                id bereich
                0  chatclienten
                1  boards
                2  internetchats
                3  ircclienten

                "boards"
                id seitenname link anmeldungnoetig kostenlos altersbegrenzung
                0  nummer1.de ...............................................

                "internetchats"
                id seitenname link anmeldungnoetig kostenlos altersbregrenzung
                0  nummer2.de ...............................................

                "chatclienten"
                id client version von kann logo link kostenlos
                2  ding1 ...............................................

                "ircclienten"
                id client version von kann logo link kostenlos
                4  ding1 ...............................................

                -------------

                Alles okay so?

                Jetzt habe ich allerdings echt keine Ahnung wie die SQL Abfrage aussehen soll.
                Wenn ich die z.B. Bewertung von "ding 1" haben will , wie muss die Abfrage lauten, ich habe mich mit Joins auseinander gesetzt aber ich verstehe nicht wie ich sowas hier machen soll..

                mfg

                Peda

                1. Mahlzeit,

                  Also ich werd mal genau sagen wie die Tabellen heißen und was drin steht:

                  Ah, jetzt verstehe ich. Du könntest - im Sinne der Normalisierung - natürlich noch jeweils 2 Tabellen zusammenfassen:

                  "boards"
                  id seitenname link anmeldungnoetig kostenlos altersbegrenzung
                  "internetchats"
                  id seitenname link anmeldungnoetig kostenlos altersbregrenzung

                  "seiten"
                  id seitentyp_id seitenname link anmeldungnoetig kostenlos altersbegrenzung

                  Dazu noch eine Tabelle:
                  "seitentypen"
                  id seitentyp

                  "chatclienten"
                  id client version von kann logo link kostenlos
                  "ircclienten"
                  id client version von kann logo link kostenlos

                  "clienten"
                  id clienttyp_id client version von kann logo link kostenlos

                  Dazu noch eine Tabelle:
                  "clienttypen"
                  id clienttyp

                  Wenn ich die z.B. Bewertung von "ding 1" haben will , wie muss die Abfrage lauten, ich habe mich mit Joins auseinander gesetzt aber ich verstehe nicht wie ich sowas hier machen soll..

                  Wie lautet der Rest von Deinen Tabellen konkret? Also die Bewertungstabelle hauptsächlich ...

                  MfG,
                  EKKi

                  --
                  sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
                  1. Hi.

                    Wie lautet der Rest von Deinen Tabellen konkret? Also die Bewertungstabelle hauptsächlich ...

                    Okay du kriegst jetzt genau alles 100% wie ichs hab:
                    ----------------------------------------------------

                    • boards (sid)
                      id seitenname link anmeldungnoetig kostenlos altersbegrenzung bid
                      0  seite1.de  http nein            ja        nein             0

                    • internetchats (sid)
                      id seitenname link anmeldungnoetig kostenlos altersbegrenzung bid
                      0  seite2.de  http ja              ja        nein             1

                    • chatclienten (sid)
                      id client von version kann logo link kostenlos bid
                      0  icq    icq 6       nix  ht.. htt. ja        2

                    • ircclienten (sid)
                      id client von version kann logo link  kostenlos bid
                      0  mirc   irc 2       viel  ht.. htt. nein        3

                    • bereiche   (bid)
                      id bereich
                      0  boards
                      1  internetchats
                      2  chatclienten
                      3  ircclienten

                    • bew_and_anz (bewid)
                      id bew bew_anz
                      0  100 10
                      1  200 50
                      2  300 100
                      3  20  5

                    • client_or_site_and_bereiche
                      id bid sid bewid
                      0  0   0   0
                      1  1   0   2
                      2  2   0   3
                      3  3   0   1

                    So, ich möchte nun von chatclienten id 0 die bewertung wissen!
                    Wie????

                    lg

                    peder (ich verzweifel)

                    1. Mahlzeit,

                      Okay du kriegst jetzt genau alles 100% wie ichs hab:

                      Ich wiederhole jetzt nicht, dass ich Dein Datenbanklayout für ziemlich unausgereift, fehlerträchtig und kompliziert halte und dass ich nicht in Deiner Haut stecken möchte, was Pflege, Wartung und Erweiterung des Systems angeht ... denn das willst Du anscheinend nicht hören. Naja - wer nicht hören will, muss fühlen ... ich wünsche Dir gute Nerven und viel Erfolg!

                      So, ich möchte nun von chatclienten id 0 die bewertung wissen!
                      Wie????

                      Steh ich auf dem Schlauch? Was ist daran so schwer?

                      SELECT bew_and_anz.bew / bew_and_anz.bew_anz AS bewertung
                        FROM bew_and_anz
                        JOIN client_or_site_and_bereiche ON bew_and_anz.id = client_or_site_and_bereiche.bewid
                       WHERE client_or_site_and_bereiche.bid = 2
                         AND client_or_site_and_bereiche.sid = 0

                      (Gegebenenfalls Aliase usw. einbauen)

                      MfG,
                      EKKi

                      --
                      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Mahlzeit,

    Gibts Verbesserungsvorschläge?

    Ja. Wieso hast Du 5 verschiedene Tabellen für (im Prinzip) gleiche Inhalte?

    Außer dieser Tabelle

    1. Tabelle (Seiten-Bereiche)
      id bereiche
      0  Boards
      1  Cooleseiten
      2  uncooleseiten
      3  tolleseiten
      4  untolleseiten
      ...

    brauchst Du für die einzelnen Seiten doch nur eine Tabelle mit den folgenden Feldern:

    2. Tabelle (Seiten)
    id bereich boards (weitere spalten mit anderen infos)...
    0  1       link
    1  4       link
    2  1       link
    3  3       link
    ...

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Mahlzeit,

      Gibts Verbesserungsvorschläge?

      Ja. Wieso hast Du 5 verschiedene Tabellen für (im Prinzip) gleiche Inhalte?

      Weil ich nach [link=http://forum.de.selfhtml.org/?t=164545&m=1072672]Bios Prinzip[/link] gegangen bin..

      http://forum.de.selfhtml.org/?t=164545&m=1072672

      Peda

      1. Mahlzeit,

        Ja. Wieso hast Du 5 verschiedene Tabellen für (im Prinzip) gleiche Inhalte?

        Weil ich nach [link=http://forum.de.selfhtml.org/?t=164545&m=1072672]Bios Prinzip[/link] gegangen bin..

        Ähm, nein. Bist Du nicht. Jedenfalls nicht, was "Seiten-Bereiche" und die vielen Tabellen zu den jeweiligen Bereichen angeht.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|