Posts mit dem Label Datenbank werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Datenbank werden angezeigt. Alle Posts anzeigen

Samstag, 28. Oktober 2023

Datenbank - Warum Transaktionen?

In meinem Beitrag Überblick über Datenbankmanagementsysteme (DBMS) habe ich PostgreSQL im Zusammenhang mit dem Transaktionsverfahren erwähnt. Ich werde kurz erklären, für was Transaktionen im Datenbankumfeld hilfreich sind.


Transaktionen helfen dabei dass Änderungen vollständig und dauerhaft in der Datenbank gespeichert werden. Dies nennt man auch ACID-Kriterien.

Am Besten lässt sich dies mit einem Beispiel aus dem Bankensektor beschreiben "Es soll eine Überweisung von einem Konto auf ein anderes durchgeführt werden":

  1. Es wird der Kontostand des einen Kontos um 100 Euro vermindert und soll durch das Programm  später auf dem anderen Konto erhöht werden.
  2. Es kommt zu einem Fehler und der Server stürzt genau während dieser Aktion ab.
  3. In diesem Fall muss der komplette Vorgang zurück abgewickelt werden, damit keine fehlerhaften Daten in der Datenbank verbleiben.

Die einzelnen Punkte in dem Programm müssen eine TRANSACTION gehüllt werden. Gibt es am Ende  keine Probleme führt man zum Ende den COMMIT Befehl aus. Somit wird sichergestellt, dass immer nur alles oder nichts geändert. Bei Problemen kommt es zu einem ROLLBACK.


Datenbank - Überblick über Datenbankmanagementsysteme (DBMS)

Nach einem Datenbank Artikel zum Thema Universally Unique Identifier (UUID) als Primärschlüssel verwenden, möchte ich in diesem Beitrag einen kurzen Überblick über Datenbankmanagementsysteme (DBMS) geben.


Einen guten Überblick bekommt man durch die Webseite db-engines.com, sie stellt Bestenlisten bereit und berechnet die Popularität von Datenbanken anhand von Suchergebnissen.


Die Oracle-Datenbank, MySQL und Microsofts SQL Server sind die Top 3 der relationalen Datenbanken und sind die erste Wahl für viele Anwendungen.

Möchte man schnell einen ersten Prototypen entwickeln (ohne Administration einer Entwicklungsinstanz mit einer Datenbank hochzufahren), bietet sich zu SQLite an. Eine Bibliothek, die ein DBMS imitiert, aber keinen Serverdienst hochfährt. Die Daten liegen hier in in einer lokal gespeicherten Datei. Siehe auch mein Beitrag SQLite - Import CSV File - existing or new table.

PostgreSQL ist auch eine relationale Datenbank, unterstützt zum Beispiel das Transaktionsverfahren und den Datentyp JSON. Die Daten werden im JSON-Format abgelegt und sind durchsuch- und manipulierbar (ohne reguläre Ausdrücke verwenden zu müssen). Auch bieten die Funkionen LISTEN und NOTIFY eine Event-Driven-Architecture.

Beim Thema NoSQL (schemalose dokumentengestützte Datenbanken) kommt oft MongoDB zum Einsatz. Für ein Objekt was gespeichert werden soll muss somit keine Tabelle mit Spalten und Datentypen angelegt werden. Gleiche oder ähnliche Datenobjekte speichert man hier in einer Collection.

Elasticsearch verwendet man, wenn man große Datenmengen mit viel Text durchsuchbar speichern möchte z.B. für eine Suchmaschine.


Sonntag, 27. August 2023

Datenbank - CSV-Dateien mit SQL abfragen (SQL connect to CSV Data)

Mein letzter Beitrag zum Thema CSV ist schon etwas länger her (SQLite - Import CSV File - existing or new table) ;-) . Es gibt mehrere Möglichkeiten CSV-Dateien "wie eine Datenbank" zu verwenden, wie z.B. CsvJdbc, DuckDB und WhatTheDuck.


CsvJdbc (schreibgeschützter JDBC-Treiber)

CsvJdbc ist ein schreibgeschützter JDBC-Treiber. CSV-Dateien (Comma Separated Value) können als Datenbanktabellen verwendet werden. Es eignet sich zum Schreiben von Datenimportprogrammen oder zum Analysieren der Dateien.
Eine Verbindung zu den CSV-Daten kann zum Beispiel mit dem Squirrel SQL Client erfolgen (siehe auch https://www.cdata.com/kb/tech/csv-jdbc-squirrel-sql.rst).

DuckDB Datenbank-Engine bzw. WhatTheDuck

DuckDB bzw. WhatTheDuck eignet sich für die Verarbeitung und Speicherung von tabellarischen Datensätzen aus CSV-Dateien. So lassen sich CSV-Dateien mit SQL-Abfragen bearbeiten um eine interaktive Datenanalyse oder gleichzeitige große Änderungen an mehreren Tabellen durchzuführen.

Dank WhatTheDuck kann man dies direkt im Browser durchführen und die Abfragen der SQL-Statements lassen sich anschließend wieder im CSV-Format herunterladen.


 

Samstag, 12. März 2022

Datenbank - Universally Unique Identifier (UUID) als Primärschlüssel anstatt Integer verwenden

Die Verwendung von Tabellen, Spalten, Primärschlüsseln und Sekundärschlüsseln sind die Grundlagen für den Aufbau eines Datenbanksystems. Um die Datensätzen für Verarbeitung-, Zugriffs- und Speicherungszwecken nutzen zu können, werden in der Regel Tabellen  mit einer ID als Primärschlüssel und Sekundärschlüssel angelegt. Als Datenformat verwendet man meistens ein 32-Bit-Integer und aktiviert das automatische Inkrementieren für die ID mit jeder neu angelegten Zeile. Die Verwendung eines 32-Bit-Integer kann aber in bestimmten Situationen zu Problemen führen, welche sich mit Hilfe von einer anderen universell eindeutigen Kennung (UUID) umgehen lässt.

Anhand dem folgenden Beispiel der Tabelle "Raumtechnik", vergibt die Datenbank immer automatisch eine freie ID.

CREATE TABLE Raumtechnik (Id INT NOT NULL AUTO_INCREMENT, Typ VARCHAR(255) NOT NULL, Beschreibung VARCHAR(255), PRIMARY KEY (Id));

Beispiel für ein logisches Datenbankkonzept.

Integer (UNSIGNED INT / BIGINT)

Eine Möglichkeit der Optimierung wäre hier einen vorzeichenlosen Integer (UNSIGNED INT) zu verwenden. Siehe auch "Im Dezember 2014 übertraf die Aufrufzahl von Psys Video „Gangnam Style“ auf YouTube das 32-Bit-Integer-Limit von 2 147 483 647."

Id UNSIGNED INT NOT NULL AUTO INCREMENT,

So lässt sich der Zahlenraum für IDs verdoppeln von 0 bis 4 294 967 295. Für sehr große Projekte sollte daher der 64-Bit-Integer UNSIGNED BIGINT verwendet werden. Aufpassen sollte man hier aber bei Web Applikationen (JSON Format), denn JavaScript-Engines der Browser haben hier irgendwann Probleme.

Probleme von Auto-Increments

Auto-Increments können bei der Verwendung von Datenbank Clustern ggf. ein Problem werden. Denn hier erhält jeder Node einen Schreibauftrag. Damit sie sich nicht bei jedem Insert auf die nächste ID einigen müssen erhöhen die Nodes die ID nicht um +1, es wird um die Anzahl der Nodes im Cluster erhöht.

Verwendet man in seiner Applikation Import- und Export-Funktionen, kann dies in einer relationalen Datenbank (über Schlüssel mit anderen Tabellen verknüpft) beim Importieren von Datensätze aus einer anderen Datenbank zu Problemen führen. So können Einträge bereits existieren und IDs sich doppeln, die Einträge müssten somit neue IDs bekommen und in allen anderen relevanten Tabellen müssen die Fremdschlüssel aktualisiert werden. Je nach dem wie groß der Import ist, kann es hier zu sehr großen verketteten Abhängigkeiten kommen.

Verwendet man IDs in seiner WebAPI (uni.org/klausurergebnis/123), kann dies schnell zum Sicherheitsproblem innerhalb der Anwendung führen. So lassen sich IDs sehr einfach erraten und ggf. fremde Ergebnisse abrufen.
 

UUIDs Universally Unique Identifier

UUIDs können in einer Datenbank als Alternative zum Integer verwendet werden und können die oben beschriebenen Probleme beim Importieren von Daten und Zusammenführen der Datensätze verhindern.

Die UUID (Request for Comments 4122) besteht aus einer 16-Byte-Zahl, ist hexadezimal notiert und in fünf Gruppen unterteilt:

550e8400-e29b-11d4-a716-446655440000

Microsoft nennt dieses Verfahren anders, nämlich GUID (Globally Unique Identifier).

Erzeugen lassen sich die UUIDs unter PostgreSQL mit Hilfe von gen_random_uuid () und bei Microsoft SQL Servern verwendet man beim Anlegen der Tabelle den UNIQUE IDENTIFIER.

CREATE TABLE Raumtechnik (unique_id UUID DEFAULT gen_random_uuid (), Typ VARCHAR(255) NOT NULL, Beschreibung VARCHAR(255), PRIMARY KEY (unique_id));

Zukünftige Konflikte sollten mit der Verwendung von UUIDs so gut wie ausgeschlossen sein, denn eine UUID ist einzigartig und kann nur einmal vergeben werden.

Samstag, 29. Juni 2013

SQLite - Import CSV File - existing or new table

Für mobile Webanwendungen oder Android Applikationen werden in der Regel SQLite Datenbanken verwendet. SQLite unterstützt dabei einen Großteil der im SQL-92-Standard festgelegten SQL-Sprachbefehle.

Weitere Informationen zu SQLite und Downloadmöglichkeit findet Sie hier:
http://www.sqlite.org/download.html

Öffnen der Datenbank mit Hilfe der SQLite command-line shell
attach "my.db" as db1;

Mit dem Kommando ".databases", sollte die soeben hinzugefügte Datei jetzt gelistet werden.








In eine vorhandene Tabelle sollen Daten aus eine CSV Datei importiert werden

Die vorhanden Datenbank hat folgende Struktur:
sqlite> select * from schueler;
1;Max;Mustermann;210;2011
2;Paul;Mustermann;211;2011

Folgende Daten befinden sich in der CSV Datei:
sqlite> select * from schueler;
3;Max;Mustermann;110;2012
4;Paul;Mustermann;111;2012

Da die Datenstruktur übereinstimmt, können die Daten mit dem folgenden Befehl direkt importiert werden:
sqlite> select * from schueler;
sqlite> .separator ';'
sqlite> .import schueler.csv schueler

Hinweis: Sollte es Probleme mit Umlauten geben, muss die CSV Datei im UTF8 Format gespeichert werden. Dies geht zum Beispiel mit Notepad++ - Kodierung - Konvertiere zu UTF8.

In eine leere bzw. neue Datenbank CSV Dateien importieren und dabei die Tabellen anlegen

Dies geht zum Beispiel mit dem Programm SQLite Database Browser (http://sourceforge.net/projects/sqlitebrowser/).




Aufbau der CSV Datei:
_id;jahr;vorname;nachname;zeit
20115248;2011;Erik;Test-Muster;00:04:10
20115152;2011;Jan;Test-Muster;00:04:17
20115153;2011;Tim;Test-Muster;00:04:21

Damit die Daten inkl. der Spaltenstruktur importiert werden können, muss das richtige Trennzeichen (separator) und "Extract field names from first line" ausgewählt werden.






Nach dem erfolgreichen Import der Daten sollte unter dem Menüpunkt "Modify Table" noch die richtigen Datentypen für die einzelnen Spalten angepasst werden!

Weiterführende Literatur zu SQLite: 
The Definitive Guide to SQLite (The Expert's Voice in Open Source)

Dienstag, 14. Mai 2013

MS-SQL Tricks

Eine kleine Auflistung von MS-SQL Tricks, die fast täglich zur Anwendung kommen.

Alle Tabellen einer Datenbank löschen:
 Exec sp_MSforeachtable  
  @command1 = "DROP TABLE ? PRINT '? dropped'",  
  @whereand = "and uid = (SELECT schema_id FROM sys.schemas WHERE name = 'dbo') ";  

Informationen über eine Tabelle ausgeben:
 sp_spaceused [TABELLENNAME]  
Gibt die Anzahl der Zeilen sowie den zugeordneten und verwendeten Speicherplatz für eine bestimmte Tabelle, eine indizierte Sicht oder eine Service Broker-Warteschlange in der aktuellen Datenbank bzw. den zugeordneten und verwendeten Speicherplatz für die gesamte Datenbank an.  

Überprüfen ob man Zugang zu der DB hat, kann man recht schnell mit einer Telnet-Verbindung:
 telnet sqlserver.name.de [PORT]  

Backup/Dump der Datenbank erstellen:
Hierfür muss das SQL Server Management Studio geöffnet werden.
  • "DB_name" DB auswählen und im Kontext-Menü TASKS --> SKRIPTS GENERIEREN auswählen. 
  • Anschließend auf "Weiter" klicken. Die Datenbank auswählen "DB_name".
  • Damit auch die INSERT-Befehle gesichert werden, unter Tabellen-/Sichtoptionen --> "Skript für Daten erstellen" auf TRUE setzen. Als Objekttyp "Tabellen" auswählen. 
  • Im nächsten Fenster sollten alle Tabellen (Alles auswählen) markiert werden. 
  • Jetzt können die CREATE und INSERT Befehle in einer Datei oder in einem Abfragefenster gespeichert werden. 
  •  Einspielen: Um die Befehle für die richtige DB auszuführen, muss direkt in der ersten Zeile nach USE die richtige DB angegeben werden. In unserem Fall "USE [DB_name]"