Daten einlesen

Hallo zusammen,

ich bin der absolute N00B im Datenbanking aber zutiefst fasziniert von der Materie. Ich habe mich nach einiger Recherche für Postgres entschieden und möchte dies der Einfachheit halber unter Win7 mit einem GUI wie PGadmin oder SQLworkbench nutzen. Installation habe ich dank der guten Dokus hinbekommen. Allerdings machen dann alle Manuals mit SQL-Operationen weiter. Ich frag mich aber immer noch, wie ich überhaupt Daten in die Datenbank kriege.
Vlt hab ich auch mangels Verständnis eine grundlegend falsche Vorstellung wie so ein System funktioniert. Deshalb hier mal meine Ansprüche an die Datenverwaltung: Ich möchte Daten verschiedener Quellen zu einer Thematik oder aus verschiedenen Jahren zur gleichen Sache in getrennten Tabellen erfassen und halten, diese aber mittels Schlüsseln verknüpfen um globale Abfragen dieses Datenpools zu realisieren. Bspw. Zeige mir alle Erträge von Parzelle XY der Jahre A-Z. Für jedes Jahr liegt eine Ertragstabelle vor, der verknüpfende Schlüssel wäre die Parzellennummer.

Meine erste Berührung mit Datenbanken hatte ich innerhalb von Esri ArcGIS. Da hab ich eben Tabellen ins Projekt geladen und dann über die Schlüssel untereinander oder mit Geodaten verknüpft. Daher meine Vorstellung.

Gerne nehme ich alle Verweise auf Tutorials an (auch wenn ich die meisten wohl schon abgeklappert hab) oder Vorschläge, wie man mit anderer Software meine Ansprüche lösen kann. Danke schonmal.

Erst einmal hast Du mit PostgreSQL eine gute und richtige Wahl getroffen!

Das SQL in Namen der DB ist Programm: Du wirst mit SQL-Befehlen Tabellen erstelln müssen und diese mit SQL-Befehlen füllen un dspäter mit SQL auch wieder abfragen.

Also, schau Dir einfach SQL an, dazu gibt es massig Anleitungen. Hast Du ganz konkrete Fragen?

Moin,

Danke für die Hilfe.
Ich weiß, dass ich mit SQL arbeiten muss, aber die meisten Tutorials legen los mit Abfragen, Joins und was noch. Mir liegen bereits Daten vor (xml, txt), die ich nun mit der Datenbank besser verwalten möchte. Zeilenweises Eintragen kommt nicht in Frage, da es einfach zu viele Daten sind. Nach langem Suchen fand ich endlich den COPY-Befehl (http://www.postgresql.org/docs/9.4/interactive/sql-copy.html). Braucht den nicht jeder? Allerdings wird COPY von meiner SQLWorkbench allerdings nicht als Befehl erkannt (färbt sich nicht automatisch blau) und folgender Fehler tritt auf:

COPY prz_id_2016 FROM ‘C:/Users/…/test.txt’

FEHLER: konnte Datei „C:/Users/…/test.txt“ nicht zum Lesen öffnen: Permission denied

Die Datei ist aber nicht schreibgeschützt und liegt auf dem selben Laufwerk wie die Datenbank. Any suggestions?
Wie bekommt ihr so eure Daten in die Datenbank?

Ah, ein proprietärer Befehl in SQLWorkbench scheint den Job zu erledigen:

WbImport -file=C:/Users/…/prz_id_2015.txt
-table=prz_ID_2015
-filecolumns=Wdh,gp,prz_id_2015;

Sehr schön, mal gespannt, wie ich damit zurecht komme.
Dennoch meine Frage nach Alternativen: Wie macht ihr das mit dem Dateninput?

“Dennoch meine Frage nach Alternativen: Wie macht ihr das mit dem Dateninput?”

Dazu gibt es kein Universalrezept.

Siehe akretschmer.
Ich gehe meist so vor:
Als erstes Daten so aufbereiten, dass ich sie stumpfsinnig in eine Tabelle in der Datenbank einlesen kann. Alles was danach an Formatierung, Zerteilen, Zuweisen noch notwendig ist direkt in der Datenbank mit SQL ausführen. Vorteil ist eine implizierte QS, die weitgehend verhindert, das halbe oder kaputte Datensätze etc. entstehen. Wenn alles fehlerlos im Datenmodell gelandet ist kann die Importtabelle wieder weg.

danke für die Antworten.
Ich habe jetzt schon einige Daten eingelesen oder in der db erzeugt und experimentiere gerade mit Abfragen. Letztlich ziele ich damit auf die endgültige Verwendung der db für meine weitere Arbeit. Da stellen sich mir weitere Verständnisfragen:
Die gemäß den Normalformen zerlegten Daten führe ich mit JOINS in Abfragen zusammen. Wenn ich die Ergebnisse dieser Abfragen nun in neuen Tabellen speichere, aktualisieren sich die Daten nicht automatisch, wenn ich in den Detailtabellen was verändere. Macht Sinn, weil ja nur das Ergebnis der Abfrage exportiert wird, die Verbindungen aber nicht erhalten bleiben.
Aber wie erreiche ich genau so eine Tabelle, die sich auf einfache Weise aktualisieren lässt, wenn sich Daten in den Quelltabellen ändern oder dazukommen? Ich meine, ich kann natürlich den Codefetzen speichern mit dem ich die Tabelle zusammengestellt hab und diesen nach Änderungen wieder anwenden. Aber geht das nicht eleganter? Etwa so, dass wenn ich auf die Tabelle zugreife, zunächst überprüft wird, ob in den Detailtabellen Änderungen aufgetreten sind? Ich mein spätestens, wenn mehrere Benutzer die Daten manipulieren, weiß der eine ja nicht, wann und ob der andere was geändert hat. Oder ich führe eben Änderungen in einer “Mastertabelle” durch und möchte, dass diese auch in die Quelltabellen der Daten übergehen, da diese vlt noch mit anderen Tabellen in Verbindung stehen.
Muss ich da mit TRIGGERN und STORED PROCEDURES auseinandersetzen?

Ich denke, Du suchst Views. Möglicherweise materialized Views.

Wenn mehrere Nutzer Datensätze gleichzeitig öffnen bearbeiten können z.B.in einem Web-Formular o.ä. kannst du sog. ‘optimistic locking’ verwenden. Damit wird ein Timestamp der letzten Änderung mitgeführt und beim Schreiben der Daten geprüft. Wenn der sich in der Datenbank geändert hat kann man feststellen ob jemand den Datensatz parallel geändert hat und kann entsprechende Maßnahmen einleiten.