Ben: Anfängerfrage - Welcher Typ für was?

Hallo,

habe bereits auf einigen Seiten nachgesehen, aber nirgends eine wirkliche Lösung gefunden.

Ich möchte mir privat eine kleine CD-Datenbank mit PHP und MySQL erstellen. Eher so zum Üben und Testen, hat jedoch auch einen
netten funktionalen Hintergrund. :-)

Ich habe mir das so vorgestellt, dass ich 5 Spalten in einer Tabelle anlege. Und zwar folgende:

1. ID
2. Typ (CD-Rom oder Musik-CD)
3. Bezeichnung (Titel der CD-Rom oder Interpret bei Musik CDs)
4. Inhalt
5. Bemerkung

Mein Problem liegt bei dem Feld für Inhalt. Hier möchte ich dann wahrscheinlich ein Array anlegen, um z.B. einzelne Programme bzw. Tracks einer Musik CD
speichern zu können. Aber welchen Typ muss ich dann für diese Spalte nehmen? ENUM und SET verstehe ich leider noch nicht wirklich. :-( Habe aber das Gefühl,
dass es eins davon sein müsste. Oder irre ich mich da vollkommen?

Wäre schön, wenn mir jemand mit etwas Erfahrung da mal helfen oder mir vielleicht auch gute Links/Bücher empfehlen könnt. :-)

Vielen Dank im Voraus!

Viele Grüße
Ben

--
Phantasie ist wichtiger als Wissen. - Albert Einstein
  1. Ich möchte mir privat eine kleine CD-Datenbank mit PHP und MySQL erstellen.

    Mein Problem liegt bei dem Feld für Inhalt. Hier möchte ich dann wahrscheinlich ein Array anlegen, um z.B. einzelne Programme bzw. Tracks einer Musik CD
    speichern zu können. Aber welchen Typ muss ich dann für diese Spalte nehmen? ENUM und SET verstehe ich leider noch nicht wirklich. :-( Habe aber das Gefühl,
    dass es eins davon sein müsste. Oder irre ich mich da vollkommen?

    Ja, Du irrst :) Mit ENUM und SET kannst Du nur vorgegebene Werte angeben, ENUM ist eine Aufzählung, SET ist ein Satz Daten.

    Unter ENUM kannst Du Dir zum Beispiel Farben vorstellen: Du definierst die Farbwerte "rot", "grün" und "blau" und kannst dann im entsprechenden Feld eines Datensatzes einen dieser drei Farbwerte angeben.
    Genau genommen könnte man auch Typen wie INT als Untergruppe von ENUM ansehen, denn bei INT kannst Du auch nur einen Wert aus einer Gruppe von Werten (z.B. -128 bis +127) angeben. Die INT-Familie ist also gewissermaßen eine vordefinierte Gruppe von ENUMs.

    Ein SET ist grundsätzlich ein Feld, in dem man mehrere Werte ein- oder ausschalten kann, im Englischen sagt man zu diesen Werten manchmal auch "flags", eher bekannt ist Dir sicherlich die Bezeichnung "bit".
    Du kannst also beispielsweise einen SET-Typ definieren, der die Bits "Mehl", "Zucker", "Eier" und "Butter" vorgibt. Im Datensatz-Feld könnte es dann heißen "Mehl,Zucker,Eier" oder "Mehl, Butter" oder "Eier, Zucker".

    Wie Du siehst, hat das alles nichts mit Deinem Problem zu tun, Du könntest höchstens für den CD-Medientyp ein ENUM benutzen. Für den Inhalt hingegen greift etwas, was sich hinter dem Wörtchen "relational" versteckt. Dieses Attribut bedeutet, daß Datensätze aus verschiedenen Tabellen in Verbindung (in Relation) miteinander stehen. Normalerweise bekommt dafür jeder Datensatz in Tabelle A eine eindeutige Kennung ("ID") und bei jedem dazugehördenden Datensatz aus Tabelle B wird diese Kennung ebenfalls eingetragen, so daß man alle Datensätze aus Tabelle B (die Titel einer Musik-CD) dem Datensatz aus Tabelle A (Name der CD, Gesamtlänge, Typ) zuordnen kann.

    Du legst Dir also zwei Tabellen an, eine für die allgemeinen CD-Daten und eine weitere für die CD-Inhalte. Erstere mit den allgemeinen Daten hast Du Dir schon ausgedacht. Den Datensätzen in der zweiten Tabelle verpasst Du (neben den anderen Daten wie Einzeltitel und seine Position) ein Feld, in das Du die ID des jeweiligen CD-Datensatzes aus der ersten Tabelle einträgst.

    Gruß,
      soenk.e

    1. Hallo Soenke,

      vielen Dank für die Erklärung. Ich glaube, jetzt habe ich auch ENUM verstanden. :)

      Dann werde ich wohl eine zweite Tabelle anlegen und dort die entsprechende ID miteintragen lassen. Dürfte ja kein Problem sein.

      Gesamtlänge ist übrigens (genau wie Länge der einzelnen Tracks) ein sehr netter Denkanstoß. Danke dafür. :)

      Jedoch würde mich jetzt ENUM noch mehr interessieren. *g* Ich könnte also, wenn ich das richtig verstanden habe, zwei Werte für den CD-Medientyp vorgeben (CD-ROM und Musik-CD z.B.). Aber wie verwirkliche ich denn dann, was davon in der Zelle steht?

      Vielen Dank!

      Viele Grüße
      Ben

      --
      Phantasie ist wichtiger als Wissen. - Albert Einstein
      1. Jedoch würde mich jetzt ENUM noch mehr interessieren. *g* Ich könnte also, wenn ich das richtig verstanden habe, zwei Werte für den CD-Medientyp vorgeben (CD-ROM und Musik-CD z.B.). Aber wie verwirkliche ich denn dann, was davon in der Zelle steht?

        Ich hab's nie benutzt, aber im Prinzip müsste das so sein wie immer:

        insert into tabelle set farbe="rot"

        In der anderen Richtung (select) bekommst Du den Text "rot" geliefert.

        Falls Du die Möglichkeit hast, phpMyAdmin zu benutzen, lege einfach mal eine Tabelle an und spiele ein wenig damit rum.

        Gruß,
          soenk.e

        1. Hallo Sönke,

          ich kann da auch einen Standard-Wert vordefinieren und wenn nichts anderes eingetragen wird, wird dieser automatisch eingeschrieben oder?

          Dann ist das ganze ja eigentlich eher sowas wie eine Beschränkung, was da jetzt drin stehen darf oder?

          Danke für die Aufklärung und deine Geduld mit einem PHP und MySQL-Neuling! :-)

          Viele Grüße
          Ben

          --
          Phantasie ist wichtiger als Wissen. - Albert Einstein
          1. ich kann da auch einen Standard-Wert vordefinieren und wenn nichts anderes eingetragen wird, wird dieser automatisch eingeschrieben oder?

            Eigentlich schon.

            Dann ist das ganze ja eigentlich eher sowas wie eine Beschränkung, was da jetzt drin stehen darf oder?

            So ist es und hat dementsprechend natürlich seine Vor- und Nachteile - man muß es nur richtig einsetzen :)

            Gruß,
              soenk.e

            1. Hi Sönke,

              danke für deine Erklärungen und Hilfen. Werde mich wohl heute Abend mal an die Datenbank setzen und nochmal überdenken.

              Ich habe noch viel zu lernen und ich hoffe, ich darf noch öfter mit solchen Fragen nerven. ;-)

              Viele Grüße
              Ben

              --
              Phantasie ist wichtiger als Wissen. - Albert Einstein
    2. Hallo nochmal,

      habe gerade wegen der ID überlegt, da ich diese mit Auto_Increment anlege. Wie kann ich diese denn dann auch für die entsprechende Zeile in der zweiten Tabelle eintragen lassen?

      Viele Grüße
      Ben

      --
      Phantasie ist wichtiger als Wissen. - Albert Einstein
      1. Hallo Ben,

        habe gerade wegen der ID überlegt, da ich diese mit Auto_Increment anlege. Wie kann ich diese denn dann auch für die entsprechende Zeile in der zweiten Tabelle eintragen lassen?

        Die kannst Du nicht eintragen lassen, sondern musst Du selbst ermitteln und anschließend eintragen.

        Du legst zunächst einen Eintrag in der CD-Tabelle an

        Welche ID zuletzt angelegt wurde, das liefert Dir
            mysql_insert_id()
        http://www.php.net/manual/de/function.mysql-insert-id.php

        Diesen Wert verwendest Du anschliessend, um die Inhalte wegzuschreiben.

        Ach noch was, vergiss nicht in der Inhaltstabelle auch ein Feld Interpret vorzusehen, es gibt ja auch Sampler.

        Gruss,

        Vinzenz

        --
        Die FAQ </faq/> des Forums sind lesenswert und hilfreich.
        1. Hi Vinzenz,

          Die kannst Du nicht eintragen lassen, sondern musst Du selbst ermitteln und anschließend eintragen.

          Du legst zunächst einen Eintrag in der CD-Tabelle an

          Welche ID zuletzt angelegt wurde, das liefert Dir
              mysql_insert_id()
          http://www.php.net/manual/de/function.mysql-insert-id.php

          Diesen Wert verwendest Du anschliessend, um die Inhalte wegzuschreiben.

          Ok, dann werde ich das heute Abend/Nacht mal ausprobieren. Vielen Dank!

          Ach noch was, vergiss nicht in der Inhaltstabelle auch ein Feld Interpret vorzusehen, es gibt ja auch Sampler.

          Ja, da hast du recht. Werde ich berücksichtigen. Danke! :-)

          Vielen Dank und viele Grüße
          Ben

          --
          Phantasie ist wichtiger als Wissen. - Albert Einstein
      2. Hi Ben

        habe gerade wegen der ID überlegt, da ich diese mit Auto_Increment anlege. Wie kann ich diese denn dann auch für die entsprechende Zeile in der zweiten Tabelle eintragen lassen?

        Das musst du selbst machen, denn die ID der richtigen CD muss in jedem Datensatz der Inhalts-Tabelle stehen. Das könnte folgendermassen aussehen:

        CD-Tabelle
        ID   | Typ   | Name
        001  | Audio | My Britney Sampler ;-)
        002  | PC    | Web-Tools
        ...  | ...   | ...

        Inhalts-Tabelle
        ID   | CDID | Name
        001  | 001  | Stronger
        002  | 001  | Opps, I did it again
        003  | 002  | HTML-Editor
        004  | 002  | SelfHTML 8.0
        005  | 002  | Apache 1.3
        ...  | ...  | ...

        Mit einer speziellen SQL-Abfrage (JOIN) kannst du die Daten z.B. so ausgeben lassen, dass du eine Trackliste bekommst, bei der dann immer auch der CD-Name angegeben ist.

        Google mal nach den Stichworten Datenbankdesign,RDM,ERD und den verschiedenen Beziehungen (1:1,1:n,m:n). Wenn du das kapiert hast, dann kannst du auch ein richtiges Datenbankmodell erstellen.

        MfG

        Tom2

        --
        "Experience is something you don't get until just after you need it."
         by Steven Wright
        1. Hi Tom2,

          001  | Audio | My Britney Sampler ;-)

          Öhm, woher weißt du das? ;-)

          Mit einer speziellen SQL-Abfrage (JOIN) kannst du die Daten z.B. so ausgeben lassen, dass du eine Trackliste bekommst, bei der dann immer auch der CD-Name
          angegeben ist.

          Aha, ok. Dann werde ich da nachher einmal drüber nachlesen. :-)

          Google mal nach den Stichworten Datenbankdesign,RDM,ERD und den verschiedenen Beziehungen (1:1,1:n,m:n). Wenn du das kapiert hast, dann kannst du auch ein richtiges Datenbankmodell erstellen.

          Werde ich tun. Vielen Dank für deine Hilfe!

          Viele Grüße
          Ben

          --
          Phantasie ist wichtiger als Wissen. - Albert Einstein