Datenbankaufbau - Hilfe benötigt

G

gabber

Guest
Hallo zusammen,

ich bin neu im Forum also habt bitte Verständnis wenn ich etwas falsch mache.
Kommen wir mal zu meinem Hilferufe. Ich habe ein altes DOS-Programm (Pilzkartierung) das ich aktuell neu entwicklen möchte. Die Pilzdaten vom DOS-Programm liegen aktuell in zwei DBF-Dateien die ich in Python auslesen kann. Gerne würde ich von diesen DBF-Files auf eine SQLite Datenbank portieren. Folgende Bedingungen müssen nacher bei der Portierung der Daten gegeben sein:

  • Jeder Pilz hat eine eindeutige Nummer
  • Ein Pilz hat einen eindeutigen Vollname
  • Ein Pilz gehört zu genau einer Gattung
  • Ein Pilz gehört zu genau einer Familie
  • Ein Pilz gehört zu genau einer Art
  • Ein Pilz kann keinen, einen oder mehrere deutsche Namen haben
  • Ein Pilz kann kein, ein oder beliebig viele Synonyme haben
  • Ein Pilz gehört zu einer oder keiner Roten Liste
  • Jeder Pilz kann Anmerkungen hinterlegt haben (Diesen möchte ich einfach als Freitext in die Datenbank einfügen)
  • Jeder Pilz hat seine eigene Literatur hinterlegt

Hier mal ein kleines Beispiel wie ich an die Daten komme. Ich habe ja zwei DBF-Files. Die eine heißt Pilze die andere Synonyme. In der Pilze-DBF gibt es eine Satznummer die eindeutig ist. Leider wurde das damals mit Buchstaben gemacht, also steht beispielsweise unter Satznummer in der DBF-File sowas wie 'gpx'. Das würde ich gerne schonmal zu einer Zahl migrieren als das z.B dann Pilz 'gpx' die Zahl 1 hat usw. Das gleiche steht in der Synonym auch. Dadurch weiß das DOS-Programm alles was zu 'gpx' gehört, gehört zusammen. Und diese Zusammengehörigkeit möchte ich jetzt in eine SQLite Datenbank migrieren unter den oben genannten Bedigungen.

Hier mal ein Auszug was mir 'gpx' im DOS-Programm liefert:

Satznummer: gpx
Gruppe: r
Familie: Boletaceae
Gattung: Boletus
Vollname: Boletus edulis Bulliard
Deutscher Name: Fichten-Steinpilz, Herrenpilz
Anmerkung: Altfunden sind wohl teilweise ss.lato aufzufassen
Rote Liste: -
Synonyme:
Boletus bulbosus Schaeff.
Boletus esculentus Pers.
Boletus solidus Sowerby
Dictyopus edulis (Bull.) Forq.
...

Ich habe auch schon mir meine Gedanken gemacht wie das ganze aussehen könnte. Hier mal meine ganzen CREATE STATEMENTS.

CREATE TABLE "PILZE" (
"ID" INTEGER NOT NULL,
"VOLLNAME" TEXT NOT NULL UNIQUE,
"ARTID" INTEGER NOT NULL,
"FAMILIENID" INTEGER NOT NULL,
"GATTUNGSID" INTEGER NOT NULL,
"SYNONYMID" INTEGER,
"GRUPPENID" INTEGER,
"ROTELISTEID" INTEGER,
"DEUTSCHERNAME" TEXT,
"ANMERKUNG" TEXT,
PRIMARY KEY("ID" AUTOINCREMENT),
FOREIGN KEY("GRUPPENID") REFERENCES "GRUPPE"("ID"),
FOREIGN KEY("GATTUNGSID") REFERENCES "GATTUNG"("ID"),
FOREIGN KEY("FAMILIENID") REFERENCES "FAMILIE"("ID"),
FOREIGN KEY("SYNONYMID") REFERENCES "SYNONYME"("ID"),
FOREIGN KEY("ROTELISTEID") REFERENCES "ROTELISTE"("ID"),
FOREIGN KEY("ARTID") REFERENCES "ART"("ID")
);

CREATE TABLE "ART" (
"ID" INTEGER NOT NULL,
"ARTNAME" TEXT NOT NULL UNIQUE,
PRIMARY KEY("ID" AUTOINCREMENT)
);

CREATE TABLE "FAMILIE" (
"ID" INTEGER NOT NULL,
"FAMILIENNAME" TEXT NOT NULL UNIQUE,
PRIMARY KEY("ID" AUTOINCREMENT)
);

CREATE TABLE "GATTUNG" (
"ID" INTEGER NOT NULL,
"GATTUNGSNAME" TEXT NOT NULL UNIQUE,
PRIMARY KEY("ID" AUTOINCREMENT)
);

CREATE TABLE "GRUPPE" (
"ID" INTEGER NOT NULL,
"GRUPPENNAME" TEXT NOT NULL UNIQUE,
PRIMARY KEY("ID" AUTOINCREMENT)
);

CREATE TABLE "ROTELISTE" (
"ID" INTEGER NOT NULL,
"NAME" TEXT NOT NULL UNIQUE,
PRIMARY KEY("ID" AUTOINCREMENT)
);

CREATE TABLE "SYNONYME" (
"ID" INTEGER NOT NULL,
"SYNONYM" TEXT NOT NULL,
PRIMARY KEY("ID" AUTOINCREMENT)
);


In der Datenbank fehlt leider noch das Thema Literatur. Da hätte ich gerne sowas wie:

  1. ID
  2. Eintragsart: (NOT NULL)
  3. Titel: (NOT NULL)
  4. Autor:
  5. Band:
  6. Ausgabe:
  7. Seiten:
  8. Erscheinungsdatum:
  9. URL:
  10. ISBN:
  11. Hinzugefügt am:

Daher meine Frage / Bitte an euch:


1. Kann mir jemand sagen wie ich diese Datenbank am besten aufgebaut wird? Die CREATE TABLE Statements währen perfekt!
2. Wie füge ich nacher die Daten in die Datenbank ein so das sie korrekt hinterlegt sind? (Die INSERT Befehle wären super)
3. Wie sieht dann später die SELECT Anweisung aus um an einen Pilz wie z.B den 'gpx' Pilz zu bekommen mit all seinen Informationen? Die Literatur soll erst angezeigt werden wenn auf ein Button geklickt wird (Dort soll auch neue hinzugefügt werden können)

Falls es Verbesserungsvorschläge gibt nur her mit falls ich total daneben liege mit dieser Struktur.


Hier mal die grafische Oberfläche für das neue Programm (sie ist noch nicht ganz fertig da fehlt z.B noch ein Feld für deutscher Name)

Bildschirmfoto vom 2021-01-09 12-41-29.png

Ich hoffe ihr könnt mir helfen. Vielen Dank schon mal im Vorraus.

Grüße gabber
 
Werbung:
Das sieht schon ganz gut aus.

Ein insert in SQLITE sieht z.B. so aus:
insert into GATTUNG values (0,'Catinella'), (1,'Imleria');

Wie Du an dem Beispiel siehst, habe ich die ID "ignoriert" und selbst eine eingetragen. Wenn Du Dich nicht um die generierte ID kümmern willst dann wäre das Insert so:
insert into GATTUNG (GATTUNGSNAME) values ('Catinella'), ('Imleria');

Du kannst die vielen Anführungszeichen weglassen und eine normale Schreibweise der Objektnamen nehmen. Wenn Du bei den Objektnamen bei deutschen Bezeichnungen bleibst, dürfte auch nie ein Schlüsselwort dabei sein.

Ein vollständiges Insert wäre dann:

insert into pilze values
(1, 'Imleria badia', 1, 1, 1, 1, 1, 1, 'Maronen Röhrling', 'lecker');

Auch hier mit expliziter Angabe der ID und ohne Angabe der Feldliste. Das Weglassen der Feldliste ist etwas schlampig und unsicher.
Das Überschreiben der ID ist auch nicht unbedingt cool, aber in kleinen Beispielen mit Nachschlagetabellen ist es praktisch und hilfreich.

Ein select baust Du so auf:
select *
from pilze p
join synonyme s on p.SYNONYMID = s.id
.. weitere joins für weitere Nachschlagetabellen

* hier setzt Du die Felder ein, die ausgegeben werden sollen
 
Danke dabadepdu so ist mir das schon bewusst das ich die Zahlen in die Pilze eintragen muss. Ich habe mich wohl vielleicht auch ein bisschen falsch ausgedrückt. Wir sprechen hier von knapp 35 000 Datensätze. Ich fülle jetzt z.B die Tabelle Familie, Gattung, Vollname und Art. Gerne würde ich jetzt automatisiert die Daten in die Pilze Tabelle einfügen. Jetzt ist z.B der Pilz 'gpx' auf nummer eins. Wie finde ich jetzt heraus welche ArtID, welche FamilienID, welche GattungsID die richtige ist?

Das müsste ich ja irgendwie über ein select Anweisung machen mit where name = 'hier der familienname' oder wie geht man da vor?

Zu den Synonymen. Jetzt hat ein Pilze 10 Synonyme füge ich dan in die Pilz Tabelle z.B bei SynonymID dann die ID 1 -10 ein sprich ich hab 10 Pilzeinträge und nur die SynonymID ändert sich macht man das so?

Hast du noch eine Idee für die Literatur wie ich diese anlegen kann so das jeder Pilz seine eigene Literaturdatenbank hat?

Danke für deine Hilfe.
 
Werbung:
Anscheinend hab ich nicht auf Antworten gedrückt, noch mal in kurz:
Die Synonyme musst Du über eine Zwischentabelle realisieren, such mal nach N:M Tabelle oder many to many relation.
Die Literatur Liste musst Du genauso umsetzen. Vermutlich kann ein Pilz in vielen Büchern auftauchen. Hier kannst Du die N:M Tabelle noch mit Details anreichern (Seite, Kapitel, ..)
Den Import würde ich mit einem Vollimport der Altdaten beginnen, einfach 1:1.
Von da aus kann man über insert .. into .. select .. from .. die Nachschlagetabellen befüllen und am Ende die Haupttabelle.
Vor dem Befüllen der zukünftigen Tabellen lohnt sich vielleicht eine Sichtung, Bereinigung, .. in den importierten Altdaten.
 
Zurück
Oben