sqlalchemy relationship grundlangen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
s45f
User
Beiträge: 12
Registriert: Donnerstag 27. Februar 2014, 13:47

hallo,

ich bin recht neu in sachen datenbanken.
und verstehe daher nicht ganz was gehen soll.

und habe ich zwei datenbanken
z.b.

db1{
a;b;c
1;100;450;50
2;100;450;56
3;100;460:50
4;200;503;50
}
db2{
a;b;c;d;e;f
1;3S;f3;def;765;50;4df
2;11;xx;dfs;450;50;4df
3;43;xd;fer;460;56;634
4;df;gr;geg;460;50;gfd

Als eingabe habe ich z.B. 100 welche in db1 auf die ersten drei einträge matched ich möchte jetzt aber die als endergebnisse die datensätze 2 & 4 von db2 zurück bekommen

Dazu finde ich recht viele tut's z.b.: http://docs.sqlalchemy.org/en/rel_0_9/o ... ships.html
allerdings verstehe ich sie nicht da mir einige Sachen nicht klar sind und eher unklarer werden je mehr ich mir ansehe.
Es handelt sich dabei doch um eine many to many beziehung oder?
z.b. wird in jedem tut das ich finde das id feld verbunden als ForeignKey
Allerdings sind die Datensätze bei mir nicht nach id identisch sonder nach {db1} b&c zu {db2} d&e
in dem fall müsste ich sie verbinden oder?
Außerdem finde ich kein Beispiel in dem die relation zu mehr als einem gleichzeitig hergestellt wird, geht das überhaupt?
Ich komm mit den ForeignKey und den relationship Anweisungen nicht zurecht.
Benutzeravatar
Balmung
User
Beiträge: 44
Registriert: Sonntag 17. März 2013, 18:36

1. Was du dort hast sind ziemlich sicher Tabellen.. nicht Datenbanken. Es ist wichtig die Begriffe zu beherrschen um Missverständnisse zu vermeiden.

2. Gibt es einen Grund die Datenpaare (z.b. "450;50") in beiden Tabellen stehen zu haben?
Statt die Werte doppelt zu haben, könntest du doch sicher einfach die entsprechenden Datensätze mit einem Fremdschlüssel in der ersten Tabelle referenzieren.

Statt also vier Felder:

Code: Alles auswählen

1;100;450;50
Hast du nur drei:

Code: Alles auswählen

1;100;2
Wobei das dritte Feld die id in der zweiten Tabelle referenziert. Über die Referenz kann man so auch auf die in der zweite Tabelle abgelegten Daten (u.a. "450;50") zugreifen. Sie müssen also nicht in der ersten Tabelle stehen.

Es könnte auch umgekehrt sein. Die id der ersten Tabelle in die zweite Tabelle eintragen. Beides wären 1:n (One to Many) Beziehungen.
Um was für eine Beziehung es sich bei dir handelt, ist bei den spärlichen und nichtssagenden Daten nicht ersichtlich. Ein konkreteres (Anwendungsorientierteres) Beispiel wäre hilfreicher, damit wir dir helfen können.
»Honk Honk«
s45f
User
Beiträge: 12
Registriert: Donnerstag 27. Februar 2014, 13:47

Danke für die schnelle Antwort, gut ich werd mal versuchen das ganze Anwendungsnah zu beschreiben.

Tablette 1 enthält die Aufträge von Kunden mit deren Aufragsnummer, den Artikel(nummer) und dessen Beschichtung.
Tabelle 2 enthält Metadaten zu der Artikel unter anderem deren Artikelnummer und dessen Beschichtung.

Mein Ziel ist es nun, das der Kunde seine Auftragsnummer eingibt und die Metadaten zu den Artikeln die er bestellt hat bekommt.

Tabelle 1 enthält demnach

Auftrag 001 ; Artikel 001 ; Beschichtung 001
Auftrag 001 ; Artikel 001 ; Beschichtung 002
Auftrag 001 ; Artikel 002 ; Beschichtung 001
usw.

Tabelle 2

Meta;Meta;Meta;Artikel 001; Beschichtung 001;Meta;Meta;Meta
Meta;Meta;Meta;Artikel 002; Beschichtung 001;Meta;Meta;Meta

Daher ist es wohl keine gute Idee daraus eine Datenbank zu machen da die Datenmenge dann exoribtant anwachsen würde da auch Tabelle 2 zur Verfügung gestellt wird um allg. sich Infos holen zu können anhand der Artikelnummer.

Also im idealfall sollte es so ablaufen: Kunde -> AuftragsNr. -> [raussuchen der artikel mit beschichtung] -> damit Tabelle 2 aufsuchen und die passenden Datensätze raussuchen und ausgeben.

So hatte ich mir das eigentlich vorgestellt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Heißt das jetzt, dass Artikelnummer und Beschichtung gemeinsam einen eindeutigen Schlüssel für Tabelle 2 bilden?
BlackJack

@s45f: Warum gibt es in Tabelle 2 nicht eine Eindeutige ID für jeden Datensatz und statt Artikelnummer und Beschichtung bräuchte man dann in Tabelle 1 nur die ID des Datensatzes in Tabelle 2.
s45f
User
Beiträge: 12
Registriert: Donnerstag 27. Februar 2014, 13:47

@Blackjack:
Sorry mein Fehler, beide Tabellen verfügen über ein auto increment Integer Column am Anfang der Tabelle. Damit ist jeder Datensatz eindeutig zu identifizieren.
Allerdings stammen die Daten für beide Tabellen aus unterschiedlichen Quellen, somit kann ich den Bezug erst bei der Suche herstellen, oder?
In den Tutorials die ich mir angesehen habe werden auch immer die id Felder verknüft, allerdings verstehe ich den Sinn davon nicht, das macht doch nur sinn wenn beide Tabellen gleich sind also sich Datensatz 3 von Tabelle 1 auf Datensatz 3 von Tabelle 2 bezieht, oder hab ich da irgendwas übersehen?


@me:
Ja, da jeder Artikel mehrere Beschichtungen aufweißen kann(nicht muss)
Es ist leider nicht mal 100% sicher das sich der Artikel mit mit der richtigen Beschichtung in der Tabelle befindet.
Somit muss ich schauen das primär die Artikelnummer und sekundär auch die passende Beschichtung matched um den Datensatz der Position auf dem Kundenauftrag zuzuordnen.


Sry für die ganzen Fragen, aber ich bin totaler neuling was SQL im Allg. und SQLAlchemy im speziellen betrifft.
jqz4n
User
Beiträge: 21
Registriert: Sonntag 2. Februar 2014, 19:26

Nein, du könntest deine DB-Struktur wie folgt aussehen lassen

db1{
id;a;b;c
1;100;450;50
2;100;450;56
3;100;460:50
4;200;503;50
5;100;765;50
6;100;460;65
}
(die beiden letzten Datensätze von mir ergänzt)
db2{
id;a;b;c;id_db1;f
1;3S;f3;def;5;4df
2;11;xx;dfs;1;4df
3;43;xd;fer;460;56;634
4;df;gr;geg;3;gfd
}
der entsprechende Datensatz aus der Spalte id_db1 von db2 bezieht sich auf den Inhalt von db1.
(Wobei der von dir gewählte Bezeichne "db" irreführend ist, so etwas würde man im Normalfalle mit zwei Tabellen in einer Datenbank realisieren).
s45f
User
Beiträge: 12
Registriert: Donnerstag 27. Februar 2014, 13:47

@jqz4n: Du hast recht db ist irreführend.

Und ja ihr habt recht, hab mir das ganze nochmal überlegt, macht wohl am meisten sinn die entsprechende id der tabelle 2 direkt beim import rauszusuchen, das wird die Zeit des imports zwar erhöhen, mir aber wohl zugleich viel arbeit sparen.

Vielen Dank an euch
Antworten