MySQL: Fragen zu Primär- und Fremdschlüssel

Ich habe zu MySQL einige Schlüsselfragen. In meiner Datenbank sollen verschiedene Produktdaten gespeichert werden:

create database produkt\_db;

use produkt\_db;

create table produkt
(
produkt\_id int unsigned not null auto\_increment primary key,
produkt\_name varchar(20) not null,
gewicht tinyint unsigned not null
) engine = InnoDB;

create table farbe
(
farb\_id tinyint unsigned not null primary key,
farb\_name varchar(15) not null
) engine = InnoDB;

create table produkt\_farbe
(
produkt\_id int unsigned not null references produkt(produkt\_id),
farb\_id tinyint unsigned not null references farbe(farb\_id)
) engine = InnoDB;

create table kurzbeschreibung
(
produkt\_id int unsigned not null primary key,
beschreibung varchar(200) not null
) engine = InnoDB;

1.)

Die Tabelle „produkt_farbe“ bildet eine m:n Beziehung ab. Jedes Produkt kann mehrfarbig sein und eine Farbe kann mehreren Produkten zugeordnet werden. Benötigt diese Tabelle, bestehend aus zwei Fremdschlüssel, einen Primärschlüssel? Wäre ein aus „produkt_id“ und „farb_id“ zusammengsetzter Primärschlüssel für diese Tabelle eine Option?

create table produkt_farbe
(
produkt_id int unsigned not null references produkt(produkt_id),
farb_id tinyint unsigned not null references farbe(farb_id),
primary key (produkt_id, farb_id)
) engine = InnoDB;

2.)

Zu einigen Produkten, aber nicht zu allen, möchte ich auch eine Produktbeschreibung in der Datenbank speichern, darum habe ich eine neue Tabelle (kurzbeschreibung) erstellt. Die Produkt ID (produkt_id) ist hier anscheinend nicht nur ein Fremdschlüssel in Bezug auf die Tabelle „produkt“, sondern ebenfalls ein eindeutiger Schlüssel (quasi Primärschlüssel). Stimmt das so?

3.)

In der Tabelle „produkt_farbe“ ist die Produkt ID (produkt_id) ein Fremdschlüssel in Bezug auf die Produkt ID aus der Tabelle „produkt“. Ist das so richtig? Ein Bezug auf die Tabelle „kurzbeschreibung“ wäre wohl Unsinn, da es für das Produkt u.U. keine Produktbeschreibung gibt, oder?

Schon mal vielen Dank für zahlreiche Antworten :wink:

Hallo Q_5,

1.)

[…] Benötigt diese Tabelle,
bestehend aus zwei Fremdschlüssel, einen Primärschlüssel? Wäre
ein aus „produkt_id“ und „farb_id“ zusammengsetzter
Primärschlüssel für diese Tabelle eine Option?

Ein Primärschlüssel wäre sinnvoll, sonst könnte die gleiche (produkt_id, farb_id)-Kombination mehrfach gespeichert werden.

Beide Fremdschlüssel bilden in dem Fall den (zusammengesetzten) Primärschlüssel, wie von Dir korrekt formuliert.

2.)

[…] Die
Produkt ID (produkt_id) ist hier anscheinend nicht nur ein
Fremdschlüssel in Bezug auf die Tabelle „produkt“, sondern
ebenfalls ein eindeutiger Schlüssel (quasi Primärschlüssel).
Stimmt das so?

Das ist korrekt; prod_id ist der Primärschlüssel. Zwischen den Tabellen produkt und kurzbeschreibung besteht eine 1:1-Beziehung. Falls mehrere Produktbeschreibungen pro Produkt angedacht sind, bräuchte die Tabelle kurzbeschreibung noch eine weitere Spalte, z.B. lfd_nr, die ebenfalls Teil des Primärschlüssels wäre.

Ob eine separate Tabelle kurzbeschreibung notwendig ist, hängt von den erwarteten Werten ab. Wenn die meisten Produkte eine Produktbeschreibung haben werden, kann die Spalte beschreibung auch Teil der Tabelle produkt sein und auf die Tabelle kurzbeschreibung könnte verzichtet werden.

3.)

[…] In der Tabelle „produkt_farbe“ ist die Produkt ID
(produkt_id) ein Fremdschlüssel in Bezug auf die Produkt ID
aus der Tabelle „produkt“. Ist das so richtig?

Das ist richtig.

[…] Ein Bezug auf
die Tabelle „kurzbeschreibung“ wäre wohl Unsinn, da es für das
Produkt u.U. keine Produktbeschreibung gibt, oder?

Der Bezug wäre auch nicht notwendig, da dieser durch die 1:1-Beziehung zwischen den Tabellen produkt und kurzbeschreibung schon existiert.

Peter

Hallo Peter,

danke für deine Antworten, sie haben mir sehr geholfen. Eine Frage habe ich allerdings noch (in Bezug auf die Tabelle „kurzbeschreibung“):

Das ist korrekt; prod_id ist der Primärschlüssel. Zwischen den
Tabellen produkt und kurzbeschreibung besteht eine
1:1-Beziehung.

Muss ich diese 1:1 Beziehung MySQL mitteilen? Ich habe folgendes probiert:

create table kurzbeschreibung
(
produkt_id int unsigned not null primary key references produkt(produkt_id),
beschreibung varchar(200) not null
) engine = InnoDB;

Stimmt das so? Zumindest gibt mir die MySQL Konsole „Query OK“ zurück.

Das ist richtig. produkt_id ist in kurzbeschreibung sowohl Fremdschlüssel als auch Primärschlüssel.

Da beide Tabellen den gleichen Schlüssel haben, ergibt sich dadurch automatisch die 1:1-Beziehung.
Natürlich muss ein Eintrag zuerst in Tabelle produkt erfasst werden, bevor einer in Tabelle kurzbeschreibung erfasst wird, da sich Letztere durch den Fremdschlüssel auf Erstere bezieht.

Peter