PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : relationale datenbank aufbauen



jean_luc_picard
22-03-2003, 20:33
geht das nun mit mysql oder nicht?

nur für denn fall das ich da was falsch verstanden habe (bitte klärt mich auf ;) ), relationale datenbank bedeutet, das man in einer tabelle auf daten einer anderen zurückgreift um redundanzen und verschiedene schreibweisen, rechtschreibfehler etc. zu verhindern?!
beispiel filmdatenbank:
ich habe eine tabelle mit den unterschiedlichen kategorien (humor, action, schnulze ;) usw.) und eine tabelle mit den filmen selbst. wenn ich nun einen neuen film hinzufüge, kann ich als kategorie NUR eine auswählen, die in der kategorien-tabelle auch angegeben ist, richtig?

ich benutze mysql und phpmyadmin. leider habe ich bisher keine tutorials dazu gefunden... bei der mysql-doku findet man zum begriff "relational" nichts :confused:

Gaert
22-03-2003, 21:03
Hallo,

MySQL ist ein Relationales Datenbank System!

Der Begriff "Relationale Datenbank" bedeutet (sehr vereinfacht), dass Daten in Tabellenform gespeichert werden, und über diese über Relationen miteinander verbunden werden. Zur Konzeption wird ein Entity Relationship Modell verwended. In diesem Modell legt man Tabellenschlüssel fest, mit denen die die Relationen (Beziehungen) zwischen den Tabellen ausgedrückt werden.

In deinem Beispiel gibt es z.B. folgende Tabellen in Klammer stehen mögliche Spalten.
PK steht für Primary Key -> Die Summe der PK's identifiziert einen Datensatz eindeutig.
FK steht für Foreign Key -> verweist auf einen PK in einer anderen Tabelle (gibt es in MySQL nicht)

"Kategorie" (katid [PK], kategorie)
"Film" (fimid [PK][FK], titel)
"spielt_mit" (filmid [PK], actorid [PK])
"Schauspieler" (actid [PK][FK], vorname, nachname)
Film -> Kategorie = (N:1) (ein Film kann nur einer Kategorie angehören)
Film -> spielt_mit = (N:M) (viele Schauspieler spielen in vielen Filmen)
Schauspieler -> spielt_mit = (N:M) (viele Schauspieler spielen in vielen Filmen)

das lässt sich weiter ausbauen... ich übernehme keine gewähr für das Datenmodell... sollte nur mal das Konzept eines Relationalen Datenmodells erklären.

Zum Schluss muss man noch sagen, dass MySQL einige (standard) Funktionen wie z.B. Foreign Keys nicht unterstützt, weshalb es von einigen nicht als vollwertiges Datenbanksystem gesehen wird.

Hoffe das macht dir einiges ein wenig klarer...

jean_luc_picard
23-03-2003, 10:36
danke schonmal :)

dann wird das ganze also über die id's verknüpft... das heißt meine kategorien sind durchnummeriert und in meiner filmtabelle sind dann nur die kategorienummern gespeichert. dann wird noch eine tabelle benötigt, in der steht, wie das ganze verknüpft ist. nach der anleitung von phpmyadmin hab ich die tabellen wie beschrieben erzeugt...
wäre denn der folgende eintrag in der form korrekt? in der master tabelle wird auf daten einer anderen (foreign) verwiesen, und nicht umgekehrt, oder?




master_db master_table master_field foreign_db foreign_table foreign_field
Video Film Kategorie Video Kategorie Kategorie



naja, ich glaube mir ist das immer noch nicht so ganz klar... ich werde nochmal im netz stöbern

Gaert
23-03-2003, 13:26
Servus!

Deinen Code verstehe ich nicht ganz... keine Ahnung was du da gemacht hast.

Das Modell, wie ich es oben erklärt habe, lässt sich in MySQL so nicht umsetzen!
Dies hat folgende Gründe:
- es werden keine Foreign Keys unterstützt
- es kann nur ein PK pro tabelle definiert werden
Um es exakt so umzusetzen musst du eine gescheite Datenbank wie Oracle, Informix, DB2 oder auch Postgre verwenden.

Es lässt sich natürlich auch in MySQL umsetzen, allerdings dann mit einigen Änderungen...
Das hier ist der SQL Code, den du für MySQL verwenden könntest.


CREATE TABLE film (
filmid integer UNSIGNED AUTO_INCREMENT ,
titel varchar(100) DEFAULT '' ,
PRIMARY KEY (filmid)
);
CREATE TABLE kategorie (
katid integer UNSIGNED AUTO_INCREMENT ,
titel varchar(100) DEFAULT '' ,
PRIMARY KEY (katid)
);
CREATE TABLE spielt_mit (
filmid integer UNSIGNED ,
katid integer UNSIGNED
);
CREATE TABLE schauspieler (
actorid integer UNSIGNED AUTO_INCREMENT ,
vorname varchar(100) DEFAULT '' ,
nachname varchar(100) DEFAULT '' ,
PRIMARY KEY (actorid)
);

Wie du siehst, hat die Tabelle "spielt_mit" keine PK's definiert, und es gibt auch keine Foreign Keys...
Nochmal zur Erklärung der Funktion von Foreign Keys:
Du hast ein Feld in einer Tabelle, welches als FK auf ein PK einer anderen Tabelle verweist. Dies hat dann die Folge, dass du in das FK Feld nur noch Werte eintragen kannst, die im PK Feld schon vorhanden sind...
Bsp: Du hast in "kategorie" Kategorien mit der katid 1 - 5 ... wenn du versuchst in der "film" das Feld katid auf 6 zu setzen, erhälst du einen Fehler...
Umgekehrt, wenn du eine Kategorie löschst, hast du die möglichkeit auch gleichzeitig alle Filme mit der katid zu löschen, weil sonst ja der Zusammenhang nicht mehr stimmt.

Bei MySQL musst du das alles immer "von hand" machen, dass heisst wenn du einen neuen Film einträgst immer checken, was für Kategorien es eigentlich gibt und schön aufpassen, dass auch nur diese gewählt werden, weil du sonst Schrott in der DB stehen hast.

In MySQL hat es sich eingebürgert, dass du als erstes Feld in einer Tabelle eigentlich immer ein Numerisches Feld hast, welches ein Autoinkrement eingestellt hat, also für jeden Datensatz einen anderen Wert hat. Nach diesem wird dann abgefragt. In anderen DBMS die mehrere PK's unterstützen wird dies häufig nicht gemacht...
Beispiel: bei "spielt_mit" brauchst du eigentlich kein Feld "rec_id", weil die Felder selbst ihren Datensatz schon eindeutig identifizieren (es kann kein Schauspieler zweimal im gleichen Film mitspielen). Im prinzip würde es reichen die beiden Felder abhängig voneinander auf unique zu setzen (aber das geht be MySQL ja auch nicht... *seufz*).

Nichtsdestotrotz ist MySQL kein schlechtes DBMS und für Einsteiger und kleine Webanwendungen bestens geeignet. Wenn man sich aber wirklich näher damit befasst, stoßen einem einige Sachen schon übel auf.

Ich würde dir empfehlen in Google mal nach "MySQL Tutorial", "Entity Relationship", "Relationale Datenbank" und "Tabellenschema" zu suchen, dann wird dir einiges vielleicht klarer.

jean_luc_picard
23-03-2003, 15:43
ich werde wohl noch viel lesen müssen... ;) ...

das beispiel oben war übrigends falsch... naja.
aber phpmyadmin bringt das schon mit neuerdings, so das man ne auswahlliste für die kategorie erhält und auch nichts anderes eingeben kann (ich weiß nicht warum es jetzt auf einmal geht)... hab mal nen screenshot angehangen... wie es mit den sogenannten n-m relationen aussieht weiß ich noch nicht... ich werde man deine tips bezüglich suchanfragen nutzen... danke :)

Gaert
23-03-2003, 16:42
Hi!

Das mit dem phpMyAdmin war mir jetzt wieder neu... hab mir den schon lange nicht mehr angeschaut...
Datenbanken und Datenmodellierung ist ein komplexes Thema. Wenn man es richtig (und performant) machen will, dann kommt man ohne einen gewissen theoretischen Background nicht aus. Mit den ganzen Tools die so im Web rumschwirren kann eigentlich jeder sich was zusammenklicken... nur wenn das Modell von vorneherein nix gescheites ist, hilft einem das beste Programm nichts.

Gruß und viel Spaß beim lesen,

Gaert