Verfahren -> Gruppensystem ala Communityseiten?

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

  • Verfahren -> Gruppensystem ala Communityseiten?

    hi!

    Ich möchte mal das Prinzip der Gruppensysteme aufgreifen.

    Leider weiß ich net genau wie ich die DB Struktur aufbauen sollte.

    es geht darum:

    Ich bin Mitglied in mehreren Gruppen, in diesen Gruppen werden Nachrichten geschrieben.

    Auf einer Seite sollen mir die Nachrichten dieser Gruppen angezeigt werden, in denen ich Mitglied bin.

    1. Schritt:

    eine Tabelle mit den Nachrichten

    ID
    Author (der Nachricht)
    GruppenID (die ganzen ID's der Gruppen die die Leseberechtigung haben)

    die Spalte GruppenID würde ich als Textfeld machen.

    warum? damit ich alle Gruppen die die Berechtigung haben, in 1 Zelle habe und damit ein einfacher abgleich möglich wäre (denke ich).

    2. Schritt:

    eine Tabelle mit meinen Gruppen in denen ich Mitglied bin

    ID
    MitgliedID
    NamederGruppe

    jetzt müßte ich anhand meiner MitgliedID in der Spalte MitgliedID (...WHERE MitgliedID = '$ID' ) einen Abgleich machen, ob von den ganzen Datensätzen (Zelle ID) 1 Wert IN DER 1. Tabelle mit den Nachrichten -> in der Spalte GruppenID eine ID vorhanden ist.

    Beispieldatensatz:

    z.B. 1. Tabelle

    *ID
    *Author
    *GruppenID

    905937 (*ID -> Index bzw. Schlüssel der Tabelle)
    675(*AuthorID)
    266,7443,23,446,8988,232,63,29567(*GruppenID's)

    2. Tabelle -> und meine Mitgliedschaft in folgenden Gruppen

    *ID
    *MitgliedID
    *NamederGruppe

    1. Gruppe:

    63 (*ID -> Index bzw. Schlüssel bzw. GruppenID meiner erstellen Gruppe)
    675(*MitgliedID -> meine ID Nummer auf der Homepage)
    Abteilung Buchhaltung (*NamederGruppe)

    2. Gruppe:

    446 (*ID -> Index bzw. Schlüssel bzw. GruppenID meiner erstellen Gruppe)
    675(*MitgliedID -> meine ID Nummer auf der Homepage)
    Abteilung Poststelle (*NamederGruppe)

    Ich Hoffe ich konnte das einigermaßen erklären.

    2. Gedanke war, statt eines Textfeldes mit allen ID's, einen Datensatz pro ID machen.

    Dann würde das aber bedeuten, das ich bei 1 Nachricht und 5 Gruppen die die Nachricht erhalten sollen, 5 Datensätze habe, damit würde ich mir doch meine Tabelle bzw. Datenbank zu müllen oder?

    ODER

    Sollte ich 3 Tabellen machen?

    1. Tabelle die Nachricht

    2. Tabelle die ID der Nachricht (ID -> 2356) + die ID der Gruppen

    2356 | 23
    2356 | 446
    2356 | 83448

    Oder liege ich mit den 3 Varianten auch total falsch?

    Hat jemand dann eine Idee wie so etwas funktioniert?

    Bestes Beispiel bei diesen sozialen Netzwerken ist doch diese genannte Pinnwand.

    da sehe ich die Nachrichten von den Gruppen in denen ich Mitglied bin (wenn der Author der Nachticht meine GruppenID als Berechtigung mit gegeben hat).
    Zuletzt geändert von Gamer20; 18.08.2012, 16:43.

  • #2
    Hallo,

    mehrere IDs in eine Spalte zu schreiben, ist eine ganz schlechte Idee. Die Variante mit der dritten Tabelle, welche die Zuordnungen enthält (n:m-Relation) ist der Weg, den man für so etwas üblicherweise geht.

    Für eine normalisierte Datenbank solltest du sowieso darauf achten, dass in den einzelnen Spalten atomare Werte gehalten werden. Irgendwelche Komma- oder sonstwie getrennten Werte sind ein sicheres Zeichen für schlechtes Design.

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      hmm die 3. variante mit den 3 tabellen wäre auch mit inner Join am einfachsten zu realisieren (denke ich).

      aber hat man da nicht doppelte datensätze in der DB (beim auslesen kann man ja gruppieren).

      bzw. hat man dann nicht extra viele datensätze? jeder seitenbetrieber versucht doch auch die DB klein zu halten und nicht nur die PHP scripte.

      hmm und die 1. variante mit den ID's im textfeld mit simmikolon getrennt und zusätzlich eine art LIKE mit "%" abfrage wäre wohl zu viel und zu unschön von der struktur her? aber da hätte ich weniger datensätze die durchsuch werden müssen.

      OK wenn ich ein textfeld nehme, statt INT, verbrauche ich ja auch einiges. da ein textfeld mehr bytes reserviert, als ein INT feld.

      oh man ich habe kopfschmerzen.

      aber die 3. variante scheint wohl am logischsten.

      schade das man net bei google+ und co. einfach mal nachfragen kann, die werden es einem eh net verraten.
      Zuletzt geändert von Gamer20; 18.08.2012, 18:49.

      Kommentar


      • #4
        Zitat von Gamer20 Beitrag anzeigen
        hmm die 3. variante mit den 3 tabellen wäre auch mit inner Join am einfachsten zu realisieren (denke ich).
        Richtig.

        Zitat von Gamer20 Beitrag anzeigen
        aber hat man da nicht doppelte datensätze in der DB (beim auslesen kann man ja gruppieren).
        Nein, wieso sollte man doppelte Datensätze in der DB haben? Man hat höchstens wiederholende Teiltupel in der Ergebnismenge beim Joinen, aber das muss man dann sowieso (wie du schon sagtest) mit einem Gruppenwechsel verarbeiten.

        Zitat von Gamer20 Beitrag anzeigen
        bzw. hat man dann nicht extra viele datensätze?
        Ja, aber dafür sind DBMS ja da, um vernünftig mit Massendaten arbeiten zu können. Bei ein paar Millionen Datensätzen ist ein normales DBMS eher noch unterfordert.

        Zitat von Gamer20 Beitrag anzeigen
        jeder seitenbetrieber versucht doch auch die DB klein zu halten und nicht nur die PHP scripte.
        Ich kenne nicht einen, der das jemals behauptet hätte. Ich kenne aber viele, die versuchen, die DB sauber zu halten und dazu gehört ein vernünftig normalisiertes und indiziertes Datenmodell.

        Zitat von Gamer20 Beitrag anzeigen
        hmm und die 1. variante mit den ID's im textfeld mit simmikolon getrennt und zusätzlich eine art LIKE mit "%" abfrage wäre wohl zu viel und zu unschön von der struktur her? aber da hätte ich weniger datensätze die durchsuch werden müssen.
        Wenn du wüsstest, wie aufwändig es für MySQL ist, irgendeine LIKE-Bedingung zu prüfen, statt mal schnell durch den Binary Tree mit den Fremdschlüsseln zu rauschen, würdest du diese Variante schon deswegen nicht mal in Erwägung ziehen. Mal von den typischen Fehlern abgesehen, die einem mit LIKE schnell passieren können.

        Zitat von Gamer20 Beitrag anzeigen
        aber die 3. variante scheint wohl am logischsten.
        Sagte ich ja.

        Zitat von Gamer20 Beitrag anzeigen
        schade das man net bei google+ und co. einfach mal nachfragen kann, die werden es einem eh net verraten.
        Sofern die noch mit relationalen Datenbanken arbeiten, würden die genau wie alle anderen auch ein normalisiertes Datenmodell benutzen, weil alles andere einfach keinen Sinn macht.

        Gruß,

        Amica
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          super danke für die erklärungen.

          werde nächstes wochenende mal versuchen das auszulesen.

          wenns noch bissle holpern sollte (obwohl die anderen abfragen mit INNER JOIN ja klappen), kann ich mich ja immer noch mal melden.

          aber erstmal VIEELLLEENNNN DANK.

          Kommentar


          • #6
            hmm ich wollte eine unterabfrage machen:

            Code:
            $ausgabe = mysql_query("SELECT * FROM Gruppennamen WHERE ID  = (SELECT GRPID FROM Gruppenpersonen WHERE NID2 = '$ID')");
            while($i = mysql_fetch_array($ausgabe))
            {
            ...
            }
            d.h. ich benötige erst die GRPID aus der 2. tabelle (die gruppe in der ich vorhanden bin), um dann mir aus der 1. tabelle die daten (wie name, erstellungsdatum und die ID des gruppenleiters) heraus zu holen.

            ich könnte zwar in aus der schleife zuerst mir die GRPID raus holen und ann in dieser schleife (...) wieder eine neue abfrage zu machen für die 1. tabelle.

            wäre aber zu aufwendig, darum wollte ich das in "einem abwasch" machen.

            leider spuckt SQL mir nur das aus:

            Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files\xampp\htdocs\*.php on line 26

            jemand eine idee was an meiner unterabfrage falsch ist?

            [EDIT]

            Fehler gefunden (man ich sollte nach einigen stunden programmierung doch erstmal ins bett gehen)

            hier die lösung, für die die genau das selbe machen wollen wie ich:

            Code:
            $ausgabe = mysql_query("SELECT * FROM Gruppennamen WHERE ID  IN (SELECT GRPID FROM Gruppenpersonen WHERE NID2 = '$ID')");
            while($i = mysql_fetch_array($ausgabe))
            {
            ...
            }
            wer eine effizientere methode hat (was sql weniger belastet), darf es mir gerne mitteilen.
            Zuletzt geändert von Gamer20; 26.08.2012, 22:19.

            Kommentar

            Lädt...
            X