Muss Fremdschlüssel in 'Kind-Tabelle' Primärschlüssel sein?

Alles, was MySQL betrifft, kann hier besprochen werden.

Muss Fremdschlüssel in 'Kind-Tabelle' Primärschlüssel sein?

Postby melly » 15. September 2010 16:46

Hallo zusammen,

ich programmiere einen kleinen Webshop und habe dafür eine Datenbank mit mehreren Tabellen angelegt. Sie besitzen folgende Eigenschaften:

  • Jede Tabelle hat eine Spalte mit einer eigenen ID, die automatisch inkrementiert wird. Dieses Feld '......_id' ist auch der Primärschlüssel der jeweiligen Tabelle.
  • Keine meiner Tabellen besitzt einen zusammengesetzten Primärschlüssel.
  • Befindet sich in einer Tabelle ein Primärschlüssel einer anderen Tabelle, habe ich eine interne Beziehung zugefügt, und diesen so als Fremdschlüssel gekennzeichnet (Verbindungsende mit dickem blauen Punkt = Fremdschlüssel)

Hier die Übersicht:

Image


Kann mir jemand sagen, ob ich die Primärschlüssel der Tabellen so lassen kann? Oder müssen die Fremdschlüssel auch in der 'Kind-Tabelle' ein Primärschlüssel sein und zusammen mit der ID-Spalte der Tabelle einen zusammengesetzten Primärschlüssel ergeben?

Also dass sich z.B. in der Tabelle 'article_numbers' der Primärschlüssel aus 'article_number_id' und 'article_id' zusammensetzt. Im Moment ist 'article_numbers' der Primärschlüssel und 'article_id' durch die interne Beziehung ein Fremdschlüssel. Ist dies so richtig? 'article_number_id' wird automatisch inkrementiert und kommt somit immer nur einmal vor...

Ich bin mir einfach nicht ganz sicher, ob ich es richtig gelöst habe. Die Sache mit den zusammengesetzten Primärschlüsseln aus Fremdschlüsseln verwirrt mich irgendwie... :(

Danke schon mal im Voraus für Anregungen ;)

Grüße Melly
melly
 
Posts: 12
Joined: 14. September 2010 20:35

Re: Muss Fremdschlüssel in 'Kind-Tabelle' Primärschlüssel sein?

Postby Nobbie » 15. September 2010 19:32

Ich würde Dir andere Namenskonventionen empfehlen, sie werden Dir helfen, den Code besser lesen zu können:

a) Primärschlüssel immer nur "id" nennen - egal welche Tabelle.
b) bei Fremdschlüsseln wird dann der Tabellenname der Fremdtabelle davor gesetzt (ergibt damit den Namen, den Du jetzt für den Primärschlüssel vergibst).

Damit beantwortet sich auch schon automatisch Deine Frage: da der Primärschlüssel immer nur "id" heißt, kann also der Fremdschlüssel article_id (beispielsweise) natürlich kein Primärschlüssel sein, denn auch in dieser Tabelle (beispielsweise article_numbers) muss der Primärschlüssel id heißen.

Zusammengesetzte Primärschlüssel brauchst Du nicht und die benutzt man auch nicht. Eines der eisernen Gesetze von Codd lautet: "The key is the key and nothing than the key". Das heißt: jede Tabelle hat einen eigenen Primärschlüssel und der hat keinerlei weitere Funktion - er ist nur der Schlüssel dieser Tabelle. Bei zusammengesetzten Schlüsseln ist es fast immer so, dass die Teilschlüssel irgendeine Bedeutung haben (Primärschlüssel einer anderen Tabelle sind o.ä) und das widerspricht der Grundforderung, dass ein Schlüssel keine Bedeutung haben darf.

D.h. also Du definiert pauschal für jede Tabelle das Feld id und das ist der Primärschlüssel.

Was ich auf die Schnelle sehe, kann ich schwer beurteilen, aber der Sinn Deiner "articel_nummer" erschließt sich mir nicht - eigentlich ist doch die Artikelnummer eindeutig (also 1:1 zum Primärschlüssel). Ob man für eine Artikelnummer direkt den Primärschlüssel nimmt, darüber streiten sich die Gelehrten - ich täte es nicht. Aber man kann ja in der Artikel Tabelle neben der id noch eine Nummer definieren, die "uniq" ist und die aber ggf. bestimmten numerischen oder sonstigen Bedingungen gehorchen soll (manchmal will man aus Artikelnummern schließen können, welche Warengruppe es grundsätzlich ist o.ä. - da eignet sich die id wieder nicht, weil das nur eine belanglose Nummer ist). Aber das ist nur auf den ersten Blick das, was mir auffiel. Vielleicht meinst Du dort auch etwas anderes.
Nobbie
 
Posts: 6653
Joined: 09. March 2008 13:04

Re: Muss Fremdschlüssel in 'Kind-Tabelle' Primärschlüssel sein?

Postby melly » 17. September 2010 13:26

Hallo Nobbie,

ich habe Deine Vorschläge umgesetzt und alle Primärschlüssel id genannt. So ist es wirklich übersichtlicher, weil man auf den ersten Blick sieht, welches Feld der Primärschlüssel ist, vor allem wenn es so viele Fremdschlüssel gibt. Und in der Tabelle 'article_number' habe ich noch ein weiteres Feld (uniq) für die Artikelnummer hinzugefügt, da ein Schlüssel ja keine Bedeutung habe darf.

Danke für die ausführlichen Erklärungen, jetzt hab ich verstanden, wie das mit den Primärschlüsseln funktioniert ;)

VG Melly
melly
 
Posts: 12
Joined: 14. September 2010 20:35


Return to MySQL

Who is online

Users browsing this forum: No registered users and 3 guests