Frage von waswesich, 37

SQL-Fremdschlüssel-Beziehungen?

Hallo, wenn jetzt zum Beispiel SQL-Tabellen existieren mit dem Namen "TP1" und den Spalten "SP1", "SP2" und "SP3", die andere Tabelle mit Namen "TP2" und den Spalten "SP1", "SP2" und "SP3", 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? Wie könnte denn dann eventuell ein entsprechendes "SELECT" aussehen? Ich weiß dass das irgendwas mit "Fremdschlüssel-Beziehungen" zu tun hat, aber soweit bin ich leider noch nicht ;-) Wenn also jemand ein entsprechendes Tutorial kennen würde, würde mir das auch schon ungemein weiter helfen. Vielen Dank schon mal fürs Lesen ;-)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von wotan38, 4

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.

Kommentar von waswesich ,

...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...

Kommentar von wotan38 ,

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.

Antwort
von Plueschtier94, 28

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. 

Kommentar von waswesich ,

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.

Antwort
von Desox, 19

Willst du evtl. die tabellenwerte übereinander legen? Dass ginge mit einem JOIN Befehl.

So in etwa:

Select SP1 from TP1 INNER JOIN TP2 ON TP1.SP1=TP2.SP1;

Antwort
von Graphitiboy, 26

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..

Kommentar von waswesich ,

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...

Kommentar von Graphitiboy ,

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...

Kommentar von waswesich ,

...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.

Kommentar von Graphitiboy ,

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. 

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten