[SQL + Python] Vorgehensweise beim speichern in mehrere Tabellen

  • Moin,

    ich möchte eine Anwendung in Python schreiben mit Qt als grafische Oberfläche. Im Hintergrund soll eine Datenbank die Daten aufnehmen. Wenn ich jetzt ein Formular mit Qt erstelle, welches z.B. die Kundendaten abfragt, dann gebe ich dort den Namen und die Adresse ein, was auch problemlos funktioniert.

    Was aber wenn ich für den Kunden und für die Adresse jeweils einen eigene Tabelle habe und ich die Kunde_ID als Fremdschlüssel an die Adressen Tabelle übergeben möchte. Ich habe ja nur ein Formular und die Kunde_ID bekomme ich ja erst wenn der Datensatz in die Kundentabelle geschrieben wird.

    Tabelle Kunde:

    Code
    CREATE TABLE "Kunde" (
    	"Kunde_ID"	INTEGER,
    	"Nachname"	TEXT,
    	"Vorname"	TEXT,
    	PRIMARY KEY("Kunde_ID" AUTOINCREMENT)
    );

    Tabelle Adresse:

    Code
    CREATE TABLE "Adresse" (
    	"Adresse_ID"	INTEGER,
    	"Straße"	TEXT,
    	"Hausnummer"	TEXT,
    	"PLZ"	TEXT,
    	"Ort"	TEXT,
    	"Kunde_ID"	INTEGER,
    	FOREIGN KEY("Kunde_ID") REFERENCES "Kunde"("Kunde_ID"),
    	PRIMARY KEY("Adresse_ID" AUTOINCREMENT)

    Mir geht es allgemein um die Herangehensweise. Speichert man und liest wieder aus oder realisiert man sowas mit einer Hilfstabelle oder wie macht Ihr das ? Ich hoffe ich habe mich halbwegs verständlich ausgedrückt.

  • Nun, mit Join funktioniert das nicht. Das ist nur bei Abfragen möglich.

    Die Frage, die hier zu beantworten wäre, ist mit welcher Datenbank System arbeitest du?

    Weil eigentlich macht man das über Transaktionen, also man fügt z. B. Daten in 2 Tabellen ein und sagt dann commit und braucht sich nicht um die Datenkonistenz zu kümmen. Lediglich, wenn der commit nicht funktioniert, sagt man das dem User im Dialog.

    Problem, was jetzt kommen kann, ist dass deine Datenbank keine Transaktionen kann. Dann muss man das anders lösen.

    Nächste Frage, kann Python das? Ich kenne es nicht so gut, als dass ich die Frage beantworten könnte. Ggf, fällt mir noch das Problem ein, dass Python eventuell ein autocommit als default hat und der wäre in dem Fall abzuschalten.

    Dann noch eine inhaltliche Frage, warum willst du die Trennung von Name und Adresse? Was soll das bringen?

  • Danke Toadie, das Join hift mir schon mal beim abfragen. Bevor ich Daten abfragen kann, müssen aber erstmal welche ich die Tabellen rein.

    Hallo Karl-Heinz, für mich würde sich erstmal sqlite anbieten, ansonsten würde ich zu MySql tendieren. Ich schaue mal ins Handbuch ob sqlite Transaktionen unterstützt.

    Python macht nur einen commit wenn man das sagt, alleine sollte da nichts passieren, zumindest habe ich das noch nicht erlebt.

    Ich möchte nicht unbedingt Name und Adresse trennen, es geht eher ums Prinzip wie ich zwei Tabellen mit einem Formular befüllen kann. Ich habe das nur als Beispiel gewählt weil es können ja auch zwei Leute die selbe Adresse haben und zweimal den selben Datensatz in einer Datenbank speichern sollte man doch vermeiden oder?

  • In der Theorie schon. Aber damit handelst du dir bei Abfragen immer ein "Performance Problem" ein, weil du die Abfrage ja jetzt auf 2 Tabellen machen musst. Andererseits sparst du natürlich Plattenplatz, weil du keine Redudanzen hast. Stellt sich die Frage, wie oft kommt das vor? Wenn zum Beispiel Fritz Meier und Erna Müller beide in Hauptstraße 2 wohnen, aber Erna Hauptstr. 2 eingetippt hat, hast du doch 2 Einträge. Und wie sicherst du, dass beide nicht sehen, dass der andere schon einen Eintrag bei dir gemacht hat? Stichwort, Datenschutz. Nur ein paar Gedanken von mir.

    Bei MySQL wusste ich mal, dass diese keine Transaktionen unterstützen, das war aber in den 00 Jahren so. Das kann mittlerweile obsolet sein, weil ich das ganze nicht mehr verfolgt habe. SQLight da hab ich gar keine Ahnung von. Oracle, DB/2, MS SQL Server unterstützen dies auf jeden Fall.

  • Da hast Du wohl Recht. Von der Seite habe ich das noch gar nicht betrachtet. Es macht dann wohl Sinn, wie Du schon sagst, das in eine Tabelle zu schreiben und dann vielleicht ein paar Redudanzen in Kauf zu nehmen. Ich danke Dir für deine Hilfe.

  • Falls es jemanden interessiert, hier mein Code zum testen von Transaktionen mit Python und SQLite. Ich hoffe ich habe das so richtig interpretiert.

    Tabelle Kunde:

    Code
    CREATE TABLE "kunde" (
    	"id"	INTEGER,
    	"name"	TEXT,
    	"vorname"	TEXT,
    	"adresse_id"	INTEGER,
    	FOREIGN KEY("adresse_id") REFERENCES "adresse"("id"),
    	PRIMARY KEY("id" AUTOINCREMENT)

    Tabelle Adresse:

    Code
    CREATE TABLE "adresse" (
    	"id"	INTEGER,
    	"strasse"	TEXT,
    	PRIMARY KEY("id" AUTOINCREMENT)


    Script in Python:

    Geht bei einem der drei Cursor was schief, sollten alle nicht in die Datenbank geschrieben werden.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!