Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankaufbau, Tabellenaufbau, Welche Felder benötige ich?

Einklappen

Neue Werbung 2019

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

  • Datenbankaufbau, Tabellenaufbau, Welche Felder benötige ich?

    Hallo miteinander!

    Wie ihr sicher gleich sehen werdet bin ich hier ganz neu und auch in der Materie leider absoluter Anfänger!

    Ich bastle gerade an einer Art Gästebuch (php / mysql) (ich möchte kein Joomla, Wordpress, ... verwenden, will es ja lernen!), soll ja auch anspruchsvoll sein

    Im Grunde habe ich ein großes Problem, ich weiß nicht nach was ich suchen muss um die richtigen Ergebnisse zu finden die mir weiterhelfen*g*
    Daher belästige ich euch hier mit meiner Frage

    Ich stell mir das so vor:
    Ein User erstellt einen Eintrag, dieser wird aber nicht automatisch freigegeben, sondern muss von min. 3 anderen Usern (die Leute soll sich selbst verwalten^^) freigegeben werden damit dieser für alle wirklich sichtbar wird.


    1. Tabelle mit allen Einträgen des Users (identifiziert jeweils mit einer fixen ID)
    (oder bekomme ich hier schon Probleme mit den "5 Normalformen"???

    ID, Mail, Nick, Thema 1, Thema 2, Thema3, .... ca. 50x Felder

    2. Tabelle (zu überprüfende Eingaben)

    ID, Inhalt, InhaltsID, JA, NEIN, USER 1, USER 2, ... USER X

    ID dient zur identifikation zu welchem Poster der Eintrag gehört
    Inhalt sollte klar sein
    InhaltsID = zu bestimmen in welches Themenfeld der Eintrag bei Freigabe geschrieben wird
    JA = Anzahl der zustimmenden User
    NEIN = Ablehnungen
    USER = welcher User zugestimmt hat, damit nicht 1er 3x Ja klickt


    oder wie wäre eine Überwachung möglich, dass wirklich 3 verschiedene User zugestimmt haben?
    was ist, wenn 3 zugestimmt haben, der Eintrag in die Tabelle 1 übertragen wurde und nun finden aber 10 Leute dein Eintrag nicht gut, wie kann ich den los werden?

    wie müsste die DB aufgebaut sein, wenn ich jetzt noch dem Ersteller die Möglichkeit geben möchte zu sagen, dass sein Eintrag freigegeben und öffentlich, bzw nur für bestimmte sichtbar ist?
    Jedem zu prüfenden Thema eine Tabelle geben?
    Werden dann JOIN abfragen nicht irre kompliziert, rechenintensiv und aufwändig?


    Ich weiß, es ist leider etwas viel verlangt mir das zu erklären, aber Links oder Tipps wie ich nach Antworten suchen kann würden mir auch schon sehr helfen

    Danke für eure Hilfe!

    Lg
    Fckw

  • #2
    Normalisierung ist das Stichwort
    Fatal Error: Windows wird gestartet

    Wie administriert man ein Netzwerk: Beispiel

    Kommentar


    • #3
      Aber wenn ich schon nicht weiß, wie ich die Tabelle anzulegen habe, welche Felder ich benötige, wie soll ich sie dann normalisieren?

      Kommentar


      • #4
        1. Tabelle mit allen Einträgen des Users (identifiziert jeweils mit einer fixen ID)
        (oder bekomme ich hier schon Probleme mit den "5 Normalformen"???

        ID, Mail, Nick, Thema 1, Thema 2, Thema3, .... ca. 50x Felder
        Das scheint auf jeden Fall mal nicht korrekt zu sein -> eine neue Spalte bei einem neuen Thema. Die Daten müssen bildlich gesprochen "nach unten" (Datensätze) mehr werden (neues Thema, neuer User, etc...) und nicht "nach rechts" (Spalten).

        Schau dir mal das an, ev. hilft das für den Denkansatz was Normalisierung betrifft: http://www.peterkropff.de/site/mysql/normalisierung.htm

        LG
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Zitat von fckw Beitrag anzeigen
          Ein User erstellt einen Eintrag, dieser wird aber nicht automatisch freigegeben, sondern muss von min. 3 anderen Usern (die Leute soll sich selbst verwalten^^) freigegeben werden damit dieser für alle wirklich sichtbar wird.
          Und wie stellst du dir das vor? Wenn der Eintrag noch nicht freigegeben ist (und damit nicht sichtbar) wie sollen dann die anderen User einen Eintrag freigeben können?

          Da das nur ein einfaches Gästebuch werden soll würde ich da nicht zu kompliziert denken: die Einträge werden von einem Admin freigeschaltet (ggf. automatisch), ggf. gibt es noch einen "melden"-Link mit dem User einen unpassenden Eintrag melden können welcher dann vom Admin ausgeblendet/gelöscht wird.

          1. Tabelle mit allen Einträgen des Users (identifiziert jeweils mit einer fixen ID)
          (oder bekomme ich hier schon Probleme mit den "5 Normalformen"???

          ID, Mail, Nick, Thema 1, Thema 2, Thema3, .... ca. 50x Felder
          Falsch. Nummerierte Felder (und viele Spalten) sind quasi immer ein Hinweis darauf dass das Datenbankdesign defekt ist. Du brauchst für User und Einträge zwei Tabellen: eine für die User selbst und eine für die Einträge der User (die enthält zusätzlich noch ein Feld mit der ID des Users).

          2. Tabelle (zu überprüfende Eingaben)

          ID, Inhalt, InhaltsID, JA, NEIN, USER 1, USER 2, ... USER X
          Nein. Die Einträge kommen immer direkt in die Tabelle mit den Einträgen, werden aber eben nicht sofort angezeigt. Die Bewertungen kommen dann in eine dritte Tabelle - aber: siehe oben.

          oder wie wäre eine Überwachung möglich, dass wirklich 3 verschiedene User zugestimmt haben?
          Müssen sich die User anmelden? Wenn nein kannst du sowieso nicht verhindern dass jemand doppelt abstimmt. (und wenn ja wird keiner in das Gästebuch schreiben, dafür meldet sich niemand irgendwo an)

          Kommentar


          • #6
            Zitat von fckw Beitrag anzeigen
            Aber wenn ich schon nicht weiß, wie ich die Tabelle anzulegen habe, welche Felder ich benötige, wie soll ich sie dann normalisieren?
            Du könntest Dir eine Tabelle wertungen wie folgt anlegen:

            Code:
            test=*# \d wertungen;
               Table "public.wertungen"
             Column  |  Type   | Modifiers
            ---------+---------+-----------
             beitrag | integer | not null
             user_id | integer | not null
             ok      | boolean | not null
            Indexes:
                "wertungen_pkey" PRIMARY KEY, btree (beitrag, user_id)
            Durch den PK verhinderst Du, daß ein User mehrfach wertet. Die Auswertung ist dann trivial:

            Code:
             select beitrag, count(*), sum(case when ok then 1 else -1 end) as points, case when  sum(case when ok then 1 else -1 end) >= 3 then true::bool else false end as freigabe from wertungen group by beitrag;
            Damit die Spalte freigabe ein TRUE ergibt müssen 3 oder mehr Zustimmungen sein und es müssen mind. 3 oder mehr Zustimmungen als Ablehnungen sein.

            Das ganze kannst Du als materialized View anlegen, wenn Du die Berechnung bei jeder Abfrage sparen willst.

            Code:
            test=*# create materialized view matview_freigabe as select beitrag, count(*), sum(case when ok then 1 else -1 end) as points, case when  sum(case when ok then 1 else -1 end) >= 3 then true::bool else false end as freigabe from wertungen group by beitrag;
            SELECT 4
            test=*# create index idx1 on matview_freigabe (beitrag);
            CREATE INDEX
            Diesen kannst Du dann z.B. via TRIGGER aktuell halten, das zu zeigen spare ich mir jetzt aber.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              OK danke vorerst, eure Beiträge haben mir wertvolle Ansatzpunkte geliefert die ich jetzt erst einmal verdauen und abarbeiten muss
              Die Normalisierung muss ich mir eindeutig noch viel viel genauer ansehen, steige ich noch nicht ganz dahinter, hab da irgendeinen gröberen Verständnisfehler


              Vielen Dank!

              Lg
              Fckw

              Kommentar


              • #8
                Um ehrlich zu sein ist mir das ganze ein wenig zu hoch

                wie gesagt, ich bin Anfänger und lerne mit "learning by doing", zumindest versuche ich es.

                das Projekt dient im Grunde dazu um zu lernen, deshalb ist es sicher auch über ambitioniert für ein Gästebuch!
                Man muss sich aber anmelden, wer das nicht will hat pech*g* (Login und Sessions haben schließlich auch zu meinem Übungsstoff gehört )

                Es soll eine Rubrik geben in der User noch nicht freigegebene Beiträge sehen und bewerten können.

                Aber vielleicht fangen wir mit simpleren Dingen an, vorausgesetzt es will mir unter den Gesichtspunkten wer helfen Dankbar wäre ich! aber sonst versteh ichs auch!

                ich mache nun quasi

                Tabelle1 = alle Angaben die direkt zum User gehören (hier tu ich mich schon schwer, denn was der User zb. unter Motto ausgefüllt hat betrifft ihn ja auch direkt? aber ok)

                Tabelle2 = Motto mit allen Spalten für Inhalt, Freigabe, ... (aber dann würde ich für 25 Formularfelder 25 Tabellen anlegen, wird dann die Abfrage nicht wesentlich komplizierter / rechenintensiver als wenn ich 1 Tabelle habe mit den Einträgen aller User die ich dann gleich durch die eindeutige UserID auf 25 eingrenzen kann, anstatt in 25 Tabellen jeweils die einmal vorhandene UserID raus zu picken?)


                was mich noch beschäftigt ist, wie kann ich bewerkstelligen, dass ich bei der Übergabe vom Formular mittels POST vorhandene Einträge mit UPDATE bearbeite und nicht vorhandene einfüge?

                Ich schlaf mal wieder eine Nacht drüber, vielleicht hat sich wer erbarmt einer armen unwissenden Seele zu helfen

                Lg
                fckw

                Kommentar


                • #9
                  Zitat von fckw Beitrag anzeigen
                  Man muss sich aber anmelden, wer das nicht will hat pech*g* (Login und Sessions haben schließlich auch zu meinem Übungsstoff gehört )
                  Derjenige der Pech hat wirst wohl eher du sein - da wird sich niemand anmelden und das Gästebuch wird leer bleiben (ganz zu schweigen von der Tatsache dass niemand nochmal kommen würde um Beiträge freizuschalten). Ich halte das für eine ziemlich dämliche Idee ...

                  Tabelle1 = alle Angaben die direkt zum User gehören (hier tu ich mich schon schwer, denn was der User zb. unter Motto ausgefüllt hat betrifft ihn ja auch direkt? aber ok)
                  Was für ein Motto? Irgendein Spruch o.ä. des Users? Ja, das gehört in die Usertabelle.

                  Tabelle2 = Motto mit allen Spalten für Inhalt, Freigabe, ... (aber dann würde ich für 25 Formularfelder 25 Tabellen anlegen, wird dann die Abfrage nicht wesentlich komplizierter / rechenintensiver als wenn ich 1 Tabelle habe mit den Einträgen aller User die ich dann gleich durch die eindeutige UserID auf 25 eingrenzen kann, anstatt in 25 Tabellen jeweils die einmal vorhandene UserID raus zu picken?)
                  Keine Ahnung was du in die zweite Tabelle packen willst ... Was meinst du mit "Motto mit allen Spalten […]"? Warum 25 Formularfelder? Ja, du sollst eine Tabelle mit den Einträgen aller User machen, wie kommst du auf 25 Tabellen? Vielleicht skizzierst du mal grob auf wie deine Tabellen aussehen sollen (Tabellenname, welche Spalten), so verstehe ich nur Bahnhof ...

                  was mich noch beschäftigt ist, wie kann ich bewerkstelligen, dass ich bei der Übergabe vom Formular mittels POST vorhandene Einträge mit UPDATE bearbeite und nicht vorhandene einfüge?
                  Ein UPDATE-Query fügt keinen neuen Datensatz ein (das macht INSERT), um zu definieren welcher Datensatz geändert werden soll gibt es die WHERE-Bedingung mit der die Anzahl der betroffenen Datensätze eingeschränkt wird.

                  Kommentar


                  • #10
                    Tabelle2 = Motto mit allen Spalten für Inhalt, Freigabe, ... (aber dann würde ich für 25 Formularfelder 25 Tabellen anlegen, wird dann die Abfrage nicht wesentlich komplizierter / rechenintensiver als wenn ich 1 Tabelle habe mit den Einträgen aller User die ich dann gleich durch die eindeutige UserID auf 25 eingrenzen kann, anstatt in 25 Tabellen jeweils die einmal vorhandene UserID raus zu picken?)
                    Was für ein "Motto" denn?
                    Ich weiß nicht was du damit meinst, ich zeig mal wie ich grob an die Sache rangehen würde.

                    Tabellen:
                    User
                    Spalten: userId, name, nickname, ...
                    Erklärung: Userspezifisches Zeug eben

                    Posts
                    Spalten: postId, userId, datum, ...
                    Erklärung: Sachen die so zum Post gehören. Die userId ist ein Fremdschlüssel zur User-Tabelle, damit du dem Post auch einen Verfasser zuordnen kannst.

                    Ratings
                    Spalten: postId, userId, rating
                    Erklärung: Für jede Bewertung einen neuen Eintrag in die Tabelle einfügen, speichert dann für welchen Post, von welchem User und ob der Post ein 'ja' oder 'nein' bekommen hat.

                    Zur Darstellung musst du dann nur die Ratings-Tabelle über die postId joinen, die Ratings zählen lassen und selbst die Logik festlegen, nach der die Beiträge angezeigt werden dürfen.

                    optional:
                    PostInhalt
                    Spalten: postId, text
                    Erklärung: Gästebucheinträge können schonmal länger werden, deshalb könntest du z.B. die ersten 200 Zeichen des Beitrags in der Tabelle Posts speichern, Spalte 'vorschau' etwa, dann müsste die Datenbank bei der Übersicht über die Einträge nicht alle langen Texte mit selektieren. Du könntest dann so eine kleine 'weiterlersen'-Funktion basteln über die dann der ganze Text geladen wird.


                    Tabelle1 = alle Angaben die direkt zum User gehören
                    Vorsichtig: Wenn du Spalten nummerieren musst - Email1, Email2, ... - bist du falsch abgebogen. Für solche Sachen legt man dann neue Tabellen an und gibt ihnen den richtigen Fremdschlüssel - userId - mit um die Relationen sauber darzustellen.


                    edit:
                    Derjenige der Pech hat wirst wohl eher du sein - da wird sich niemand anmelden und das Gästebuch wird leer bleiben (ganz zu schweigen von der Tatsache dass niemand nochmal kommen würde um Beiträge freizuschalten). Ich halte das für eine ziemlich dämliche Idee ...
                    Chill mal. Ist doch nur eine Übung.
                    [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                    [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                    Kommentar


                    • #11
                      Hallo miteinander!

                      Danke für eure Beiträge und Hilfe!!

                      @tk1234:
                      nun ja, mag sein, dass es eine blöde Idee ist, aber auch aus blöden Ideen sind in der Vergangenheit viele gute und nützlich Dinge entstanden!
                      Ok so weit möchte ich dann bei meiner Übung dann zwar nicht gehen aber wer weiß^^

                      Wie gesagt, es ist eine Übung, mit einem definierten Ziel, durch die ich mir was beibringen möchte. Es muss eben leider erst der Knopf aufgehen!


                      Leider sind meine Erklärungsversuche für euch genauso schwierig formuliert wie die Übung für mich*g*

                      Also ich habe ein Formular (gehen wir mal weg vom Gästebuch, das würde wohl wirklich keiner ausfüllen^^):

                      Formularfelder:
                      Alter
                      Postleitzahl
                      Wohnort
                      Land
                      Hobbys
                      Motto
                      Musik
                      Sportarten
                      ...

                      Tabellen:
                      Login:
                      ID / SessionID / nick / passwort / mail / registrierung / letzterLogin / aktiviert / bestaetigungskennung


                      Profil:
                      ID / Alter / Postleitzahl / Wohnort / Land / Hobbys / Motto / Musik / Sportarten / + alle anderen Felder

                      Alle rot gekennzeichneten Einträge wären zu überprüfen (also durch User zu bewerten):

                      Somit würde ich für "Hobbys / Motto / Musik / Sportarten etc." entweder EINE Tabelle anlegen oder für jedes Feld eine EIGENE Tabelle mit folgenden Spalten:

                      ID / postID / Text(Inhalt) / ja / nein / freigegeben / user1 / user2 / user3 / user1no / user2no / user3no

                      mehr infos dazu in der Grafik.

                      Aber nachdem user1-3 ein Hinweis für einen Konstruktionsfehler ist sollte ich wohl noch die Tabelle einfügen:

                      Rating (siehe Bild)




                      um so mehr ich drüber nachdenke, um so verwirrter bin ich momentan*g*

                      Danke noch mal für eure Geduld und Hilfe!

                      Lg
                      Fckw!

                      Kommentar


                      • #12
                        Somit würde ich für "Hobbys / Motto / Musik / Sportarten etc." entweder EINE Tabelle anlegen oder für jedes Feld eine EIGENE Tabelle mit folgenden Spalten:
                        Zweiteres ist klar vorzuziehen. Die erste Variante entspricht dem EAV-Modell

                        Dein Post ist ziemlich farbig, die Erklärungen auf dem Bild sind auch ziemlich ungeordnet. Ich kann da eigentlich nur sagen, wirf die Posts-Tabelle weg, bau Tabellen und setz auf Relationen über die Profil-ID.

                        Versuch so sachlich wie möglich zu schreiben. Wenn du ein Problem hast, fass es knapp zusammen, lass eigene Schlussfolgerungen oder Vermutungen erst einmal raus. Dann ist es einfacher die Schwierigkeit zu erfassen.
                        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                        Kommentar


                        • #13
                          Login- und Profiltabelle lassen sich auch zusammenführen (eine Tabelle für alles), da die Daten aus beiden Tabellen nur einmal und nie wieder (in anderen Tabellen) auftauchen.

                          Kommentar


                          • #14
                            @Spamversender: Danke für den Hinweis!

                            @VPh:
                            Sorry für meine verwirrenden Ausführungen!

                            Ich versuch jetzt einfach mal mit den Hinweisen die ihr mir bisher gegeben habt was anzufangen!
                            Muss es mit "try and error" üben!

                            Also ich habe jetzt:
                            Tabellen:

                            Profil

                            Hobbys
                            Motto
                            Musik
                            Sportarten
                            ...

                            rating_Hobbys
                            rating_Motto
                            rating_Musik
                            rating_Sportarten
                            ...

                            Alle haben zumindest den PK (UserID).
                            Aber wenn ich nun die Abfrage starte (einfach alles):

                            Code:
                            SELECT * FROM
                            Hobbys,
                            Motto,
                            Musik,
                            Sportarten,
                            rating_Hobbys,
                            rating_Motto,
                            rating_Musik,
                            rating_Sportarten
                            bekomme ich das Ergebnis "MySQL lieferte ein leeres Resultat zurück (d.h. null Datensätze)."

                            Es sind einige davon wirklich leer, aber in ein paar Tabellen sind durchaus Test-Datensätze vorhanden.
                            Ich gehe davon aus es liegt an den leeren Tabellen?

                            [/CODE]SELECT *
                            FROM,
                            login,
                            profil[/CODE]

                            diese Abfrage liefert das erwartete Ergebnis ALLES aus beiden Tabellen.

                            Sobald ich jedoch auch diese zu meiner obigen Abfrage dazu gebe kommt wieder kein Datensatz.
                            Also sind es die leeren Tabellen?

                            Code:
                            SELECT *
                            FROM
                            login,
                            profil,
                            Hobbys,
                            Motto,
                            Musik,
                            Sportarten,
                            rating_Hobbys,
                            rating_Motto,
                            rating_Musik,
                            rating_Sportarten
                            Funktionierender Code, nur leider will ich mehr abfragen

                            Code:
                            SELECT hobbys.ID, hobbys.text
                            FROM profil
                            JOIN hobbys ON profil.ID = hobbys.ID
                            LIMIT 0 , 30
                            Was will ich eigentlich abfragen?

                            Ich habe ~25 Tabellen (Hobbys, Motto, Musik, Sportarten, ...) und möchte aus jeder dieser Tabelle die EINE Zeile mit der UserID raus fischen, aber weiß nicht wie ich die JOIN´s weiter machen soll, wenn es so viele Tabellen sind, hab auch gelesen, dass bei 60 Joins Schluss wäre (aber das sollte für mich nicht relevant sein^^).

                            Coder der sicher nicht geht, soll nur zeigen was ich abfragen möchte:
                            Code:
                            SELECT UserID, text
                            FROM
                            Hobbys, Motto, Musik, Sportarten, ...
                            WHERE UserID = 1

                            Hoffe ich bin nicht abgeschweift und habs einiger maßen verständlich erklärte

                            Danke!

                            Lg
                            Fckw

                            Kommentar


                            • #15
                              Musst die richtige Join-Art wählen.
                              Left Join sollte passen, es wird geprüft ob die Bedingung zutrifft, falls nicht erhält das Resultset null für die entsprechenden Felder.

                              -> Basics ansehen. http://www.peterkropff.de/site/mysql/mysql.htm sollte helfen
                              [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                              [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                              Kommentar

                              Lädt...
                              X