Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbank welcher Schlüssel?

Einklappen

Neue Werbung 2019

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

  • Datenbank welcher Schlüssel?

    Moin,
    php.de zerwirft mir ständig das Post-Format.
    Habe es deshalb hier nochmal:

    -->https://pastebin.com/NK6WYDtK

    Wenn die Datenbank so aussieht für das Verkaufen von Kleidung:
    Code:
    Tabelle 'users'                Tabelle 'produkte'
    +----+---------+----------+   +----+--------+------------+
    | id | vorname | nachname |   | id | userid | produktname|
    +----+---------+----------+   +----+--------+------------+
    |  1 | Max     | Meier    |   |  1 |      1 | T-Shirt    |
    |  2 | Lisa    | Müller   |   |  2 |      2 | Rock       |
    +----+---------+----------+   +----+--------+------------+
    Tabelle 'users':
    id hat den Primärschlüssel -> Autoincrement.

    Tabelle 'produkte':
    id hat den Primärschlüssel -> Autoincrement.
    userid hat den Index.

    Verknüpfung: users.id -> produkte.userid

    Nun soll eine weitere Tabelle für die Produktkategorie rein:

    Code:
    Tabelle 'users'               Tabelle 'produkte'                      Tabelle 'kategorie'
    +----+---------+----------+   +----+--------+---------+------------+  +----+-----------+
    | id | vorname | nachname |   | id | userid | katid   |produktname |  | id | kategorie |
    +----+---------+----------+   +----+--------+---------+------------+  +----+-----------+
    |  1 | Max     | Meier    |   |  1 |      1 |     2   |T-Shirt     |  | 1  | Damenmode |
    |  2 | Lisa    | Müller   |   |  2 |      2 |     1   |Rock        |  | 2  | Herrenmode|
    +----+---------+----------+   +----+--------+---------+------------+  +----+-----------+
    Wie vergebe ich denn nun die Schlüssel?

    Wenn ich kategorie.id -> primärschlüssel -> Autoincrement vergebe + der produkte.katid den Index und diese miteinander Verbinde (kategorie.id -> produkte.katid)
    kann ich in der Tabelle 'kategorie' zwar Kategorien einfügen und anschliessend produkte.katid den Autoincrement-Wert von kategorie.id hinzufügen.
    Anschliessend kann ich es aber nicht mehr ändern.

    Ziel:
    Ich möchte in einer Adminübersicht neue Kategorien hinzufügen können und danach diese den Produkten zuweisen.

    Die Ausgabe soll sowas ergeben:
    Max Meier T-Shirt Herrenmode
    Lisa Müller Rock Damenmode

  • #2
    "User kaufen/benutzen Produkte aus verschiedenen Kategorien."

    Für User, Produkt und Kategorie jeweils eine Tabelle (id, name)
    Eine Zwischentabelle für Produkt-Kategorie, eine weitere Zwischentabelle für User-Produkt, beide m:n

    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Vermutung, user ist ein Verkäufer.

      Wieso kannst Du es "anschließend" nicht mehr ändern?
      Was Du aufgeführt hast, würde funktionieren. Ein Produkt wird mit einer Kategorie versehen.

      Autoinc oder nicht, ist dabei bedeutungslos, es beschreibt nur, wie der Schlüsselwert entsteht.

      Kommentar


      • #4
        Zitat von Perry Staltic Beitrag anzeigen
        Vermutung, user ist ein Verkäufer.

        Wieso kannst Du es "anschließend" nicht mehr ändern?
        Was Du aufgeführt hast, würde funktionieren. Ein Produkt wird mit einer Kategorie versehen.

        Autoinc oder nicht, ist dabei bedeutungslos, es beschreibt nur, wie der Schlüsselwert entsteht.
        Hallo, du hast recht. Viele der Datensätze von produkte.katid hatten "0" als Wert bereits gehabt, was zu folgendem Fehler geführt hat:
        Code:
        #1452 - kann kind-zeile nicht hinzufügen oder aktualisieren
        Habe es auf "NULL" geändert wodurch die Verknüpfung gemacht werden konnte.

        reltest.jpeg

        Zitat von Istegelitz
        "User kaufen/benutzen Produkte aus verschiedenen Kategorien."

        Für User, Produkt und Kategorie jeweils eine Tabelle (id, name)
        Eine Zwischentabelle für Produkt-Kategorie, eine weitere Zwischentabelle für User-Produkt, beide m:n
        Du hast recht, eine M:N-Relation wäre am sinnvollsten.
        Nur wie mache ich diese resp. wie benennt man die Verknüpfungstabelle am sinnvollsten?
        Habe bereits gegoogelt und folgende Umsetzung realisiert:

        Ziel:
        Produkte sollen mehrere Kategorien enthalten können:
        mntest.jpeg

        produkte.id -> primärschlüssel / Autoincrement
        kategorie.id -> primärschlüssel / Autoincrement
        verkatprod.prodid -> index
        verkatprod.katid -> index

        Wie kann ich denn nun sowas sinnvoll abfragen?

        Irgendwie so?
        PHP-Code:
        SELECT verkatprod.prodidverkatprod.katidkategorie.kategorie FROM verkatprod RIGHT JOIN kategorie ON verkatprod.prodid '1'

        //kategorie.kategorie habe ich bisschen unglücklich benannt... natürlich wäre kategorie.katname besser
        //RIGHT JOIN, weil die Verknüpfung in der Grafik rechts zu kategorie geht, sonst LEFT JOIN.
        //INNER JOIN == JOIN (spielt keine Rolle.) 
        Folgende Werte existieren:
        users ->
        1 Max Meier
        2 Lisa Müller

        produkte ->
        1 1 T-Shirt
        2 2 Rock

        kategorie ->
        1 Damenmode
        2 Herrenmode
        3 Kindermode

        Verkatprod ->
        1 2
        1 3

        -> Ausgabe sollte sowas ergeben:
        Produkt T-Shirt hat Kategorie 2 + 3, gebe diese aus -> Damenmode - Kindermode

        Kommentar


        • #5
          Solche Abkürzungen wie "katid" sollte man besser bleiben lassen. Was ein häufiges Benennungsschema ist:

          user: id, firstname, lastname
          product: id, name, user_id
          category: id, name
          product_category: id, product_id, category_id

          Und Benennungen sollten natürlich in Englisch gehalten werden.

          Kommentar


          • #6
            Die Namen ändere ich danach ins englische, ist nur mal damit ichs verstehe....

            wie geht denn hier die SELECT-Abfrage, dass ich von Produkt "1" (id = 1) die kategoriennamen kriege?

            Also ich habe es so:

            Tabelle produkte:
            id = 1, userid = 1, produktname = T-Shirt
            id = 2, userid = 2, produktname = Rock

            Tabelle verkatprod:
            id = 1, prodid = 1, katid = 2
            id = 2, prodid = 1, katid = 3

            Tabelle kategorie:
            id = 1, kateoriename = Damenmode
            id = 2, kategoriename = Herrenmode
            id = 3, kategoriename = Kindermode

            Hier möchte ich gerne die Kategorienamen wissen von prodid = 1.

            Wenn ich das ausführe
            SELECT verkatprod.prodid, verkatprod.katid, kategorie.kategoriename FROM verkatprod RIGHT JOIN kategorie ON verkatprod.prodid = '1'

            kommt sowas unbrauchbares...

            1 2 Damenmode
            1 2 Herrenmode
            1 2 Kindermode
            1 3 Damenmode
            1 3 Herrenmode
            1 3 Kindermode

            statt:
            1 Herrenmode
            1 Kindermode

            In der Verknüpfungstabelle "verkatprod" habe ich die "id" neu hinzugefügt, damit ich solche verknüpfungen später wieder entfernen kann.

            Kommentar


            • #7
              Code:
              SELECT DISTINCT c.id, c.name
              FROM category c
              INNER JOIN product_category pc ON ( pc.category_id = c.id )
              WHERE pc.product_id = 1

              Kommentar


              • #8
                Ach du scheisse, darauf wäre ich nie gekommen resp. ist es recht schwierig zum sich dieses Wissen zu ergoogeln weil es überall unterschiedliche Problemstellungen sind...

                Funktioniert das muss ich noch besser lernen. Danke!

                Kommentar


                • #9
                  Hallo,

                  Ich habe mir nun einige Tutorials angesehen und die Abfrage erweitert.

                  Kannst du mir bitte eine Rückmeldung geben ob das so schlau ist oder es besser anders geschrieben werden soll. Sind soviele "JOIN's" wirklich nötig?!
                  Funktionieren tut es und es lässt sich damit arbeiten.

                  Ziel:
                  Ein Produkt soll beliebigen Produktgruppen + darin beliebigen Produktkategorien zugeordnet werden können.
                  SQL:
                  Zeige mir von dem Produkt mit der id "5194" die Produktgruppen und die dazugehörige Produktkategorien:
                  prod link_category_group category_group link_category category
                  id prodid groupid id name groupid catid id name
                  5194 5194 1 1 Gruppennamen 1 1 1 Kategorienamen
                  Code:
                  SELECT DISTINCT link_category_group.groupid, link_category_group.prodid, category_group.id, category_group.name, link_category.groupid, link_category.catid, category.catid, category.name
                  FROM category_group
                  INNER JOIN link_category_group
                  ON link_category_group.groupid = category_group.id
                  INNER JOIN link_category
                  INNER JOIN category
                  ON link_category.catid = category.id
                  WHERE link_category_group.prodid = 5194
                  Natürlich muss ich es in den nächsten Tagen andersrum schreiben "Zeige mir alle Produkte innerhalb der Produktgruppe xyz mit der Produktkategorie "abc".

                  Gruss Newsletter

                  Kommentar

                  Lädt...
                  X