SQL-Fremdschlüssel-Beziehungen?

...komplette Frage anzeigen

3 Antworten

Du kannst unabhängig von Fremdschlüsseln Dir anzeigen lassen, was Du sehen möchtest. Du musst das nur der Datenbank so mitteilen, damit sie das ausführen kann. Und es muss natürlich logisch möglich sein.

Du hast zwei Tabellen mit jeweils mehreren Sätzen. Zum Verknüpfen, was im Prinzip recht einfach geht, muss definiert werden, welche Sätze der einen Tabelle mit welchen Sätzen der anderen Tabelle verknüpft werden sollen. Dazu müssen bestimmte Datenfelder der einen Tabelle mit bestimmten Datenfeldern der anderen Tabelle korrespondieren. Diese Datenfelder und ihre Eigenschaften hast Du in Deiner Frage uns vorenthalten. Zur Beantwortung Deiner Frage ist das aber von Bedeutung.

Soweit ich aus dem folgenden Dialog entnehmen kann, möchtest Du die einzelnen Änderungen protokollieren und prüfen können, wer wann was geändert hat. Wie Du Dir das vorgerstellt hast, kann ich aus Deinen Angaben leider nicht entnehmen.

Die Protokolltabelle müsste als Schlüssel User, Datum und Uhrzeit enthalten, das Feld (falls mehrere Felder überwacht werden sollen), dann alter Wert und neuer Wert, eventuell reicht auch der neue Wert, je nach der späteren Auswertung.

Zu berücksichtigen ist vor allem, wie die Änderungen zustande kommen. Können mehrere User gleichzeitig ändern und spielt es dann eine Rolle, wer wessen Änderung erneut ändert?  Das muss im Datenbankdesign berücksichtigt sein, wenn später irgendwelche Abfragen machbar sein sollen.

Antwort bewerten Vielen Dank für Deine Bewertung
waswesich 08.09.2016, 14:13

...ok, da ich ja voll der SQL-Profi bin, mal ein recht
herzliches Danke für deine Antwort :-) da ich davon überhaupt keine Ahnung
habe, habe ich es, mit Hilfe von Google ;-), so gelöst. Man kann ja die
einzelnen Datensätze anhand der ID eindeutig identifizieren, zumindest bei mir
;-), mit dem entsprechenden SQL-Statement kann ich die betreffenden stellen
leicht finden. Das habe ich soweit, von den Antworten hier und unter Zuhilfenahme
von Google,  herausgefunden. Würde ich
mich da etwas besser auskennen, könnte ich auch deine Fragen, zumindest
ansatzweise, richtig beantworten, sodass ich dann einen etwaigen Lösungsvorschlag,
oder zumindest einen Ansatz, von deiner Seite bekäme der eventuell effektiver
wäre, als meiner. Sollte ich jetzt aber wieder irgendwo hängen bleiben, dann
kannst du darauf verlassen dass ich noch ein wenig mit verschiedenen fragen, nerven
werde. So Long und noch einen schönen Tag...

0
wotan38 08.09.2016, 16:42
@waswesich

Es gibt verschiedene Philosophien für das Konzipieren von Datenbanken. Eine davon besteht aus der Verwendung einer laufenden Nr als Primärschlüssel, eine ID. Benutzt wird das z.B. von Systemen, die die Konzeption maschinell unterstützen. Auch Datenbankmodelle, die im Informatikunterricht gelehrt werden (und als das einzig Wahre hingestellt werden), sind nur einige der Möglichkeiten aus der Vielfalt, was eine Datenbank kann, nämlich weit mehr. Eine meiner Datenbanken ist bei einem Rassehundezuchtverein in Betrieb. Sie hat inzwischen 57 Datenbanktabellen, mit z.T. sehr komplexen Verknüpfungen. Da ist z.B. die Ahnentafel, wo zu einem Hund die Eltern benötigt werden. Die stehen aber in der selben Tabelle. Man muss da die Tabelle mehrmals mit sich selbst verknüpfen. Das geht schon, aber nicht mit den Mitteln aus dem Informatikunterricht. Ich benutze z.B. keine JOINS zum Verknüpfen, sondern WHERE-Bedingungen. Die sind transparenter. Man sieht gleich, was wie und womit verknüpft wird.

Wie Du schreibst, ist die ID eindeutig und zum Identifizieren eines Satzes geeignet. Für die Datenbank schon, für Dich nicht. Denn Du kennst die ID nicht, die der gewünschte Satz hat. Die ID ist als laufende Nr ein reiner Fantasiewert ohne Bezug zur Außenwelt. Für bestimmte interne Verarbeitungen sind solche Nrn geeignet. Dafür kann man auch reale Daten verwenden (siehe mein Beispiel mit einem zusammengesetzten Primärschlüssel). Nummern sind schon praktisch, dafür gibt es auch reale Nrn wie Kunden-Nr, Artikel-Nr, Rechnungs-Nr, Mitglieds-Nr, Steuer-Nr usw. Am schlimmsten sind automatisch generierte IDs als Primärschlüssel. Abgesehen von einigen speziellen Anwendungsfällen ist das Ursache vieler Fehler und Irritationen.

0

Weswegen sollte man sowas machen müssen? 
Wenn du dir anzeigen lassen möchtest was in tabelle 1 ist, aber die werte von tabelle 2 sollen genommen werden, wieso dann nicht direkt die tabelle 2? 

Ansonsten geht sowas mit JOINS. 

Antwort bewerten Vielen Dank für Deine Bewertung
waswesich 07.09.2016, 10:02

Hallo Plueschtier94,

Ich arbeite an einem wöchentlichen Fahrplan, der von
mehreren Mitarbeitern geändert werden kann, die Änderungen sollen gespeichert
bleiben, sowie der der was geändert hat.

0

bestünde dann die Möglichkeit beim anzeigen der Spalte "SP2" von der Tabelle "TP1" den Wert der Spalte "SP1" von der Tabelle "TP2" zu nehmen?

Die Frage ist Sinnlos. Die ergibt einfach keinen Sinn. Hast du dich vllt falsch ausgedrückt? Warum willst du beim anzeigen einer Spalte denn den Wert einer anderen Spalte haben?! Versteh ich nicht..

Antwort bewerten Vielen Dank für Deine Bewertung
waswesich 07.09.2016, 09:51

Hallo Graphitiboy, der Wert in "SP1" von
"TP2" wird eventuell von mehreren Benutzern geändert, dann würde der
Wert von "SP2" aus "TP1" immer der aktuellste sein, und ich
könnte anhand von "TP2" nachvollziehen wer wann was geändert hat. So
zumindest ist meine Theorie...

0
Graphitiboy 07.09.2016, 09:54
@waswesich

Deine Theorie klingt nicht sehr Plausibel. Hast du einen konkreten Datensatz den die Nutzer ggf. machen als Beispiel? Ich kann immer noch nicht nachvollziehen wie du das bewerkstelligen willst...

0
waswesich 07.09.2016, 10:14
@Graphitiboy

...puhh, ich versuchs zu erklären. Wenn in Spalte1 z.B.
08:00 Uhr steht, dann kommt der nächste und schreibt 08:30 Uhr rein, und der
nächste schreibt 09:00 Uhr hinein, dann wäre 09:00 Uhr der letzte Eintrag.
Jetzt müsste aber gespeichert werden wer und wann der erste Eintrag geändert
wurde, der zweite, und so weiter.

0
Graphitiboy 07.09.2016, 13:30
@waswesich

Dann muss z.B. die Uhrzeit der Primärschlüssel der TP1 sein (jedoch müsste die Uhrzeit dann eindeutig sein, weil PK) und als Fremdschlüssel in TP2. Dann könntest du über SELECT Anweisungen mit WHERE prüfen, an welchen Uhrzeiten wer wie tätig war. 

0

Was möchtest Du wissen?