Datumsfeld oder Beziehungstabelle ?

Alles, was MariaDB und MySQL betrifft, kann hier besprochen werden.

Datumsfeld oder Beziehungstabelle ?

Postby ZaphoodB » 16. October 2009 09:14

Hallo,
folgende Situation, wie ich es bisher über Excel gemacht habe:

Kundename, Adresse, Termin 1, Termin 2, Termin 3... Termin n

Sprich jeder neue Termin war ein eigene Spalte, was bedeutet das einige Kunde nur ein weitere Spalte hatten und andere z.B. 20.

Wenn ich das ganze jetzt in MySql umsetzen will, ob da mein Gedankengang jetzt richtig ist:

Ich erstelle eine Tabelle "Kunde" und eine Tabelle "Datum"... und eine Beziehungstabelle "Termin" mit KundenId und Datum..DatumID ???

Irgendwie hört es sich nicht richtig an, stimmt das und wenn ja wo ist der Fehler ?

Danke schon mal

ZaphoodB
ZaphoodB
 
Posts: 13
Joined: 16. September 2009 09:02

Re: Datumsfeld oder Beziehungstabelle ?

Postby Stepke-DSL » 16. October 2009 09:38

Wenn du die Normalisierung einhalten willst, ist das so richtig.
Eine Tabelle für die Kunden und eine Tabelle für die Termine.
Diese beiden Tabellen verknüpfst du dann, z.B. via KundenID...

MfG Stepke
Stepke-DSL
 
Posts: 313
Joined: 12. July 2007 16:08
Operating System: Win XP Pro SP3 + SuSe Linux

Re: Datumsfeld oder Beziehungstabelle ?

Postby Nobbie » 16. October 2009 10:42

ZaphoodB wrote:Ich erstelle eine Tabelle "Kunde" und eine Tabelle "Datum"... und eine Beziehungstabelle "Termin" mit KundenId und Datum..DatumID ?


Fast. Ich führe mal "Stepke-DSL"s Antwort weiter aus.

Die Tabelle "Kunde" ist klar. Aber die andere Tabelle heißt nicht "Datum", sondern "Termin". Weil das ein Termin ist, der an einem bestimmten Datum (das wird dann ein Attribut der Tabelle "Termin") stattfindet. Ein Attributt entspricht einer Spalte der Tabelle. Man könnte eine weitere Spalte in "Termin" definieren, die nennt sich beispielsweise "Beschreibung": da könnte man Text unterbringen, was das überhaupt für ein Termin ist.

Und jetzt kommt es drauf an, ob das eine 1:N-Beziehung ist (das heißt, ein Kunde kann an N Terminen teilnehmen - so sieht es bisher aus), oder ob es eine M:N-Beziehung ist (das würde bedeuten, dass nicht nur ein Kunde zu verschiedenen Terminen kommen kann, sondern dass an jedem Termin auch mehrere verschiedene Kunden kommen können - das kann ich von hier aus nicht beurteilen).

Machen wir erst Fall 1 (1:N Beziehung):

Jede Tabelle bekommt grundsätzlich immer das Feld "id", das ist der Primärschlüssel, der wird grundsätzlich immer als Integer mit AUTO_INCREMENT definiert. Weil das nur der Primärschlüssel der jeweiligen Tabelle ist, nichts sonst.

Dann bekommt die Tabelle "Termin" eine Spalte "Kunde_id" (ich würde grundsätzlich mit genormten Spaltennamen arbeiten). Da wird die "id" desjenigen Kunden gespeichert, der diesen Termin wahrnimmt. Die Tabelle Kunde bekommt kein entsprechende Spalte, da stehen nur Kunden-Attribute drin (id, Name, Vorname, Ort usw.). Damit sieht die Tabelle "Termin" mindestens so aus:

id, Kunde_id, Datum

Ob da noch eine Beschreibung dazu kommt, wie oben angedeutet, mußt Du selbst entscheiden. Oder meinetwegen ein Attribut "Wichtigkeit" oder was auch immer - das mußt Du festlegen, was Du über diesen Termin wissen willst. Im Feld Datum steht natürlich das Datum (wobei da auch die Uhrzeit drin stehen darf, wie letztendlich das Format für das Datum aussieht, mußt Du auch selbst festlegen). So, wie Du es am besten verarbeiten kannst. Der Form halber schreiben wir auch noch die Tabelle Kunde auf, die sieht ungefähr so aus:

id, Name, Vorname, Ort, Strasse, Telefon

Ich habe einfach irgendwas geschrieben - wichtig ist, dass Du erkennst, dass in der Kundentabelle kein sog. "Fremdschlüssel" enthalten ist, sondern nur in der Tabelle "Termin" (nämlich die id des Kunden "Kunde_id" - so etwas nennt sich "Fremdschlüssel" - Foreign Key auf Englisch, den Begriff wirst Du oft lesen).

So, nun der schwierigere Fall, nämlich die M:N-Beziehung, es dürfen dann zu einem Termin auch mehrere Kunden kommen, außerdem darf (wie bisher) ein Kunde zu mehreren Terminen kommen.

Nun könnte man natürlich wieder anfangen, bei den Terminen Spalten dazuzufügen, a la "kunde_id_1", "kunde_id_2" usw. - aber genau das geht eben nicht, weil man dann ständig die Tabelle ändern muss, je mehr Kunden an einem Termin kommen dürfen. Gleiches Problem wie Dein Eingangsproblem. Für die Lösung des Problem muss man eine eigenständige, neue Tabelle definieren, und die ist eine Zusammensetzung der beiden vorhandene Tabellen und kombiniert diese; deswegen nennen wir die Tabelle sinnvollerweise "Kunde_Termin". Diese Tabelle bekommt (wie jede Tabelle) eine "id" (der Primärschlüssel) und dann nur noch genau zwei weitere Felder, nämlich einmal einen Verweis auf einen Kunden, dafür brauchen wir wieder kunde_id, und einmal einen Verweis auf einen Termin, als eine termin_id. Im Gegenzug fliegt aus der Tabelle "Termin" die Spalte "kunde_id" heraus, denn die ist nun in der neuen Tabelle "Kunde_Termin" gelandet und wird nur noch dort benötigt.

Und jetzt ist eigentlich schon alles klar, wir schauen uns die neue Tabelle Kunde_Termin mal an:

id, kunde_id, termin_id

Jeder Datensatz aus dieser Tabelle entspricht genau einem Kunden an genau einem Termin. Mit jedem Datensatz, der in dieser Tabelle angelegt wird, wird also festgelegt, welcher Kunde an welchem Termin zu erscheinen hat. Und damit ist es natürlich einfach, mehrere Kunden zum gleichen Termin zuzuordnen: man legt einfach mehrere Datensätze mit derselben termin_id an, aber bei kunde_id stehen jeweils andere Primärschlüssel. Diese Kunden haben gemeinsam diesen Termin.

Und auch anders herum geht es einfach: wenn ein Kunde zu verschiedenen Terminen kommen soll (ist das gleiche in grün), legt man für jeden Termin dieses Kunden einen Datensatz in der Tabelle Kunden_Termin an, da steht immer die gleiche kunde_id drin, aber verschiedene termin_id.

D.h.: weder in der Tabelle Kunde, noch in der Tabelle Termin wird ein Fremdschlüssel gespeichert. Dort stehen wirklich nur die Attribute, die diesen Kunden bzw. die diesen Termin beschreiben. Und die Beziehung, die es zwischen den Kunden und den Terminen gibt, die ist vollständig ausgelagert in die "Hilfstabelle" Kunde_Termin.

Theoretisch könntest Du das auch jetzt schon so machen, aber wenn Du wirklich nur eine 1:N Beziehung hast, wäre der Aufwand nicht gerechtfertigt, denn es gäbe in dieser neuen Tabelle keine doppelten termin_id (weil an einem Termin ja nur ein Kunde kommt). Deswegen kannst Du dann den oben gezeigten Weg gehen und direkt beim Termin selbst reinschreiben, um welchen Kunden es sich handelt und sparst dir diese Hilfstabelle.

Du solltest Dir unbedingt auch solche Namenskonventionen aneignen, wie ich sie hier vorgeführt habe. Sprich: Primärschlüssel heißt immer id, ein Fremdschlüssel heißt immer tabellenname_id (wobei "tabellenname" durch den entsprechenden Namen der Tabelle zu ersetzen ist). Das macht das Programm lesbar und verständlich.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Datumsfeld oder Beziehungstabelle ?

Postby ZaphoodB » 16. October 2009 12:39

Ähm...naja... aufjedenfall Danke, das du soviel geschrieben hast. :)

Aber du hast schon bemerkt, das genau das mein Gedanken war ? (Rede von der M:N, weil natürlich einTermin bei verschiedene Kunden sein kann, wie auch ein Kunde verschiedene Termine haben kann)

Also läuft es, wie ich schon sagte, auf eine Beziehungstabelle hinaus ... Gut, vielleicht heisst das bei MySql anders.

Jetzt wäre nur noch eine Frage... die Termintabelle... gibt es dort in MySql, bzw. SQL etwas, womit man die automatisch erstellen kann ? Denn jedes Jahr hat nun mal 365 Tage und auch wenn nicht an jedem Tag ein Termin stattfindet, werden das sicher trotzdem >200 Termine. Und jetzt die Tabelle per Hand zu füllen mit 01.01.2010, 02.01.2010...usw. Das könnte sonst etwas langwierig werden.

Oder geht man sowas eh ganz anders an ?

Danke nochmal

ZaphoodB
ZaphoodB
 
Posts: 13
Joined: 16. September 2009 09:02

Re: Datumsfeld oder Beziehungstabelle ?

Postby Nobbie » 16. October 2009 12:55

ZaphoodB wrote:Und jetzt die Tabelle per Hand zu füllen mit 01.01.2010, 02.01.2010...usw. Das könnte sonst etwas langwierig werden.


Wie soll es denn sonst gehen? Du mußt Dich mal von "Datum" freimachen - Du denkst nur in Tagen, wie ein Kalender. Das ist aber die falsche Denkweise.

Du mußt in Terminen denken: füllt sich Dein Terminkalender automatisch, oder trägst Du die Termine selbst ein (sei es mit Kugelschreiber in einen Kalender, sei es in einem Organizer auf einem Handy)? Natürlich trägst Du jeden Termin selbst ein. Da kann man nichts automatisieren, wie soll MySQL wissen, welche Termine welcher Kunde hat?

Es wäre auch problemlos denkbar, dass verschiedene Termine am selben Datum stattfinden. Der eine Kunde trifft sich zur Wohnungsbesichtigung, der andere will den Geschäftsführer sprechen.

Du denkst immer noch falsch, Du denkst nur an 365 Tage im Jahr. Das ist nicht richtig. Du mußt an die Ereignisse denken, der Tag, an das Ereignis stattfindet, ist nur ein Attribut des Ereignises (des Termins). Und wenn ein neuer Termin dazu kommt, wird die Termintabelle um einen Eintrag erweitert, aber dann gibt es noch keine Teilnehmer. Deswegen wird danach die Beziehungstabelle erweitert, welche Kunden an diesem neuen Termin teilnehmen. Ggf. muss dazu aber auch erst einmal die Kundentabelle erweitert werden, weil das außerdem ein neuer Kunde ist.

Und wenn das viele Termine sind und an vielen Terminen viele Kunden kommen - ja, dann mußt Du viele Einträge schreiben. Das kann Dir MySQL nicht abnehmen, die Datenbank weiß nichts von Deiner Terminplanung. Sie dient nur zur Verwaltung und Abspeicherung.

P.S.: Vielleicht stolperst Du über den Begriff "Termin". Dann nenne es "Treffen", oder "Ereignis". Damit klar ist, dass das mit einem Datum nichts zu tun hat, das Datum ist lediglich ein Attribut des Ereignisses, nämlich wann das Ereignis stattfindet.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Datumsfeld oder Beziehungstabelle ?

Postby ZaphoodB » 16. October 2009 20:32

hmm... also entweder ich versteh dich falsch oder du verstehst mich falsch :shock:

Deswegen hier mal konkret, so wie ich es mir dachte:

Tabelle 1: Kunde

KD-ID (P)---Name-------Vorname
1-------------Duck-------Donald
2-------------Maus-------Micky
3-------------Gans-------Gustav

Tabelle 2: Datum

Datum-ID (P)----Datum
1------------------02.02.2010
2------------------03.03.2010
3------------------04.04.2010

Ereignisse:
Donald hat ein Termin am 02.02 und 04.04.
Micky hat ein Termin am 03.03. und am 04.04.
Gustav aht ein Termin am 02.02

Tabelle 3: Termin (Beziehungstabelle)

KD-ID------Datum-ID
1------------------1
1------------------3
2------------------2
2------------------3
3------------------1

Und um Tabelle 2 geht, das dort ein ganzes Jahr komplett reinkommt... automatisch.

Gruß und schönes WE

ZaphoodB
ZaphoodB
 
Posts: 13
Joined: 16. September 2009 09:02

Re: Datumsfeld oder Beziehungstabelle ?

Postby Nobbie » 16. October 2009 20:58

ZaphoodB wrote:Ereignisse:
Donald hat ein Termin am 02.02 und 04.04.
Micky hat ein Termin am 03.03. und am 04.04.
Gustav aht ein Termin am 02.02


Also sind Donald und Micky gemeinsam am 04.04. bei der gleichen Veranstaltung, und Donald und Gustav fahren zusammen am 02.02. zur gleichen Veranstaltung.

Ist das so?
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04


Return to MariaDB - MySQL

Who is online

Users browsing this forum: No registered users and 7 guests