Forum: PC-Programmierung Datenbank - mehrere "Objekte" zuweisen


von DB-Bär (Gast)


Lesenswert?

Hallo,

ich versuche im Moment, in einem kleinen SW-Projekt meine 
Programmierkenntnisse zu erweitern. Dabei kommt auch eine DB zur Nutzung 
(SQLITE3), wo ich nun allerdings vor einem Problem stehe.

Das Problem ist sicherlich trivial, mir würde der passende 
Recherchebegriff reichen.

Ich habe einen Datensatz in der Tabelle Leute. Jeder davon besitzt 
Bücher.

ID  Name  Bücher
1   Hans  1,1,3
2   Lukas 1,3,4

ID  Buchname
1   Harry
2   Potter
3   Der Stein
4   Der Weisen

So, über die Spalte Bücher weise ich den Leuten Ihre Besitztümer zu. 
Allerdings ist das Handling programmiertechnisch schwer:
- Es sind immer Listen, die ich auswerten muss (1,1,3)
- ich muss immer die Anzahlen zählen, sortieren, und dann wieder auf die 
nächste Tabelle referenzieren (gebe mir Name von Buch 1,....)
- Die Zuweisung kann schnell fehlerbehaftet sein (z.B. gibt Nutzer 1,1.3 
ein)
....

Gibt es für solche Referenzierungsthemen andere/bessere Methoden? 
Objektzuweisungen, keine Ahnung?

Falls von Relevanz: Sprache ist Python.

VG

von Andreas B. (bitverdreher)


Lesenswert?

So etwas macht man normalerweise mit einer x:y Relation.
Du erstellst eine extra Tabelle die nur die Zuordnungen enthaelt.

In Deinem Bsp.

IDName   IDBuch
1        1
1        3
2        1
2        3
2        4

Darf jemand das gleiche Buch 2x haben (wg. Hans 1,1,3)?

von Dr. Sommer (Gast)


Lesenswert?

Du brauchst eine n:m Beziehung. Eine zusätzliche Tabelle "UserID" und 
"BookID" für jedes Exemplar. Lies ein Buch über relationale 
Datenbanken...

von PittyJ (Gast)


Lesenswert?

Soweit ich es kenne, sollte man eine Datenbank normalisieren:
https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)


Die Listen wie 1,1,3 haben dann in einer Tabelle nichts zu tun.

Du hast dann 3 Tabellen:
Tabelle 1 Bücher
BuchID Buchname (ISBN, Autor, Erscheinungsdatum)

Tabelle 2 Person
PersonenID Personenname (Adresse, Geburtsdatum)

Tabelle3 Besitz
PersonenID BuchID

von Possetitjel (Gast)


Lesenswert?

DB-Bär schrieb:

> Das Problem ist sicherlich trivial,

Würde ich nicht sagen, nein.


> mir würde der passende Recherchebegriff reichen.

"Normalisierung (Datenbank)".

von Joachim S. (oyo)


Lesenswert?

Interpretiere ich Dich da richtig? Du hast eine Datenbanktabelle für die 
"Leute" und eine für die "Bücher" - und in der Tabelle der "Leute" hast 
Du eine Spalte bzw. ein Feld "Bücher", das eine durch Kommata getrennte 
Liste der Bücher enthält, welche diese Person besitzt?

Falls ja: Das macht man so nicht - eine derartige Beziehung zwischen 
Leuten und Büchern wird "m:n" bzw "Many-to-many" genannt - und in 
Datenbanken mit einer zusätzlichen Tabelle umgesetzt, die in diesem Fall 
die Daten enthalten würde, welche Person welches Buch besitzt:

("Leute"-Tabelle)
ID  Name
1   Hans
2   Lukas

("Bücher"-Tabelle)
ID  Buchname
1   Harry
2   Potter
3   Der Stein
4   Der Weisen

("Person-besitzt-Buch"-Tabelle)
ID Person Buch
1  1      1
2  1      1
3  1      3
4  2      1
5  2      3
5  2      4

: Bearbeitet durch User
von Jan H. (j_hansen)


Lesenswert?

Joachim S. schrieb:
> ("Person-besitzt-Buch"-Tabelle)
> ID Person Buch

Die Spalte "ID" wird gerne weggelassen. Sieht man auch an den anderen 
Beispielen hier. Ich empfehle, sie anzulegen, weil man sich bei UPDATE 
und DELETE damit schon einfacher tut. Besonders, wenn eine Person ein 
Buch mehrfach ausleihen kann.

von Cyblord -. (Gast)


Lesenswert?

Jan H. schrieb:
> Joachim S. schrieb:
>> ("Person-besitzt-Buch"-Tabelle)
>> ID Person Buch
>
> Die Spalte "ID" wird gerne weggelassen. Sieht man auch an den anderen
> Beispielen hier. Ich empfehle, sie anzulegen, weil man sich bei UPDATE
> und DELETE damit schon einfacher tut. Besonders, wenn eine Person ein
> Buch mehrfach ausleihen kann.

Oder noch weitere Attribute relevant werden, so dass aus dieser simplen 
Zuordnung noch etwas mehr wird, beispielsweise "ausgeliehen bis" und man 
dann sowas hat Buch - Ausleihe - Person

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.