PostgreSQL - Datentypen

Hallo da, zukünftige Datenbank-Zauberer! ? Willkommen auf unserer aufregenden Reise in die Welt der PostgreSQL-Datentypen. Als Ihr freundlicher Nachbarschaftsinformatiklehrer bin ich begeistert, Sie durch dieses faszinierende Thema zu führen. Machen Sie sich keine Sorgen, wenn Sie neu im Programmieren sind – wir beginnen von den ganz Basics und arbeiten uns hinauf. Also, holen Sie sich Ihre virtuelle Zauberstab (Tastatur) und tauchen wir ein!

PostgreSQL - Data Types

Numerische Typen

Ah, Zahlen – die Bausteine der Informatik! PostgreSQL bietet eine Vielzahl von numerischen Typen, um verschiedenen Bedürfnissen gerecht zu werden. Lassen Sie uns mit einigen spaßigen Beispielen erkunden.

Integer-Typen

PostgreSQL bietet vier Arten von Integer-Werten:

Typ Speichergröße Bereich
smallint 2 Byte -32768 bis +32767
integer 4 Byte -2147483648 bis +2147483647
bigint 8 Byte -9223372036854775808 bis +9223372036854775807
serial 4 Byte 1 bis 2147483647

Lassen Sie uns eine Tabelle erstellen, um Informationen über unsere Lieblingsbücher zu speichern:

CREATE TABLE favorite_books (
id serial PRIMARY KEY,
title VARCHAR(100),
publication_year smallint,
pages integer,
isbn bigint
);

In diesem Beispiel:

  • id verwendet serial, das automatisch für jeden neuen Eintrag hochzählt.
  • publication_year verwendet smallint, weil Bücher nicht so alt sind (entschuldigung, alte Rollschriften!).
  • pages verwendet integer für die Buchlänge.
  • isbn verwendet bigint für diese langen ISBN-Nummern.

Fließkomma-Typen

Für den Fall, dass Sie Dezimalgenauigkeit benötigen:

Typ Beschreibung
real 6 Dezimalstellen Genauigkeit
double precision 15 Dezimalstellen Genauigkeit

Lassen Sie uns einige zusätzliche Details zu unserer Buchtabelle hinzufügen:

ALTER TABLE favorite_books
ADD COLUMN rating real,
ADD COLUMN price double precision;

Jetzt können wir Buchbewertungen (z.B. 4,5 Sterne) und präzise Preise speichern.

Arbitrary Precision Numbers

Für den Fall, dass Sie extrem präzise Zahlen benötigen:

CREATE TABLE scientific_constants (
name VARCHAR(50),
value numeric(1000, 900)
);

INSERT INTO scientific_constants (name, value)
VALUES ('Pi', 3.14159265358979323846264338327950288419716939937510);

numeric(1000, 900) ermöglicht bis zu 1000 Gesamtzahlen mit 900 nach dem Dezimalpunkt. Perfekt für die Pi-Enthusiasten da draußen!

Währungstypen

Geld macht die Welt gehen, und PostgreSQL hat genau den passenden Typ dafür:

CREATE TABLE product_prices (
product_name VARCHAR(50),
price money
);

INSERT INTO product_prices (product_name, price)
VALUES ('Fancy Pen', '$9.99');

Der money-Typ automatisch håndterer Währungszeichen und Kommas.

Zeichentypen

Text ist überall in Datenbanken. PostgreSQL bietet drei Hauptzeichentypen:

Typ Beschreibung
character(n) Festlänge, mit Leerzeichen aufgefüllt
varchar(n) Variabellänge mit Grenze
text Variabellänge unbegrenzt

Lassen Sie uns diese in unserer Bücherei-Datenbank verwenden:

ALTER TABLE favorite_books
ADD COLUMN author character(50),
ADD COLUMN description varchar(500),
ADD COLUMN full_text text;
  • author ist auf 50 Zeichen festgelegt (hoffentlich reicht das für "J.K. Rowling"!).
  • description kann variieren, aber nicht mehr als 500 Zeichen.
  • full_text kann das gesamte Buch speichern, wenn wir wollen (aber lass uns das doch nicht tun!).

Binärdatentypen

Manchmal müssen Sie rohe binäre Daten speichern. Hier kommt bytea ins Spiel:

ALTER TABLE favorite_books
ADD COLUMN cover_image bytea;

-- Ein Bild einfügen (stellen Sie sich das als tatsächliche binäre Daten vor)
UPDATE favorite_books
SET cover_image = '\x89504E470D0A1A0A'
WHERE id = 1;

Dies ermöglicht es uns, Buchdeckbildnisse direkt in der Datenbank zu speichern.

Datum/Zeit-Typen

Zeit ist von Bedeutung, und PostgreSQL hat es abgedeckt:

Typ Beschreibung
date Datum (keine Tageszeit)
time Tageszeit (kein Datum)
timestamp both date and time
interval Zeitintervall

Lassen Sie uns verfolgen, wann wir unsere Lieblingsbücher gelesen haben:

ALTER TABLE favorite_books
ADD COLUMN purchase_date date,
ADD COLUMN reading_start_time time,
ADD COLUMN last_read timestamp,
ADD COLUMN reading_duration interval;

UPDATE favorite_books
SET purchase_date = '2023-04-01',
reading_start_time = '20:30:00',
last_read = '2023-04-15 22:15:30',
reading_duration = '2 hours 30 minutes'
WHERE id = 1;

Jetzt können wir unsere Lesegewohnheiten analysieren! ?⏱️

Boolean-Typ

Wahr oder falsch, 1 oder 0, ja oder nein – manchmal ist das Leben binär:

ALTER TABLE favorite_books
ADD COLUMN is_favorite boolean;

UPDATE favorite_books
SET is_favorite = true
WHERE rating > 4.5;

Einfach und effektiv!

Aufgelisteter Typ

Wenn Sie eine feste Liste von Optionen haben, sind Enums Ihr Freund:

CREATE TYPE book_genre AS ENUM ('Fiction', 'Non-Fiction', 'Science', 'History');

ALTER TABLE favorite_books
ADD COLUMN genre book_genre;

UPDATE favorite_books
SET genre = 'Fiction'
WHERE id = 1;

Keine Tippfehler in Genre-Namen mehr!

Geometrische Typen

Für alle Shape-Enthusiasten da draußen:

CREATE TABLE geometric_objects (
id serial PRIMARY KEY,
name VARCHAR(50),
location point,
area box
);

INSERT INTO geometric_objects (name, location, area)
VALUES ('My House', '(10,20)', '((0,0),(100,100))');

Perfekt für das Kartografieren Ihres Dungeons & Dragons-Kampagnen!

Netzwerkadress-Typ

In unserer vernetzten Welt ist das Speichern von Netzwerkinformationen entscheidend:

CREATE TABLE network_devices (
id serial PRIMARY KEY,
name VARCHAR(50),
ip inet,
mac macaddr
);

INSERT INTO network_devices (name, ip, mac)
VALUES ('My Router', '192.168.1.1', '08:00:2b:01:02:03');

Jetzt können Sie alle Geräte in Ihrem Netzwerk im Auge behalten!

Bit-String-Typ

Manchmal müssen Sie nur mit rohen Bits arbeiten:

CREATE TABLE permissions (
user_id integer,
access_flags bit(8)
);

INSERT INTO permissions (user_id, access_flags)
VALUES (1, B'10110000');

Jedes Bit kann eine unterschiedliche Berechtigung darstellen. Wie ist das für effizienten Speicher?

Volltextsuch-Typ

PostgreSQL bietet eingebauten Support für Volltextsuche:

ALTER TABLE favorite_books
ADD COLUMN search_vector tsvector;

UPDATE favorite_books
SET search_vector = to_tsvector('english', title || ' ' || description);

CREATE INDEX textsearch_idx ON favorite_books USING GIN (search_vector);

Jetzt können Sie schnelle Suchen in Ihrer Büchersammlung durchführen!

UUID-Typ

Universell eindeutige Identifikatoren sind großartig für verteilte Systeme:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE distributed_data (
id uuid DEFAULT uuid_generate_v4(),
data TEXT
);

INSERT INTO distributed_data (data) VALUES ('Some distributed data');

Keine Sorge mehr vor ID-Kollisionen across verschiedenen Servern!

XML-Typ

Für den Fall, dass Sie strukturierte XML-Daten speichern müssen:

CREATE TABLE xml_documents (
id serial PRIMARY KEY,
doc xml
);

INSERT INTO xml_documents (doc)
VALUES (
'<book>
<title>PostgreSQL for Beginners</title>
<author>Your Favorite Teacher</author>
</book>'
);

XML in einer Datenbank? Warum nicht!

JSON-Typ

In der Ära der Webdienste ist JSON der König:

ALTER TABLE favorite_books
ADD COLUMN metadata jsonb;

UPDATE favorite_books
SET metadata = '{"tags": ["educational", "fun"], "reviews": [{"user": "Alice", "rating": 5}, {"user": "Bob", "rating": 4}]}'
WHERE id = 1;

Der jsonb-Typ ermöglicht eine effiziente Speicherung und Abfrage von JSON-Daten.

Array-Typ

Manchmal müssen Sie mehrere Werte in einer Spalte speichern:

ALTER TABLE favorite_books
ADD COLUMN keywords text[];

UPDATE favorite_books
SET keywords = ARRAY['database', 'programming', 'awesome']
WHERE id = 1;

Arrays erlauben es Ihnen, Listen von Werten zu speichern, ohne separate Tabellen zu erstellen.

Composite-Typen

Erstellen Sie Ihre eigenen benutzerdefinierten Typen, indem Sie bestehende kombinieren:

CREATE TYPE address AS (
street VARCHAR(100),
city VARCHAR(50),
country VARCHAR(50)
);

ALTER TABLE favorite_books
ADD COLUMN publisher_address address;

UPDATE favorite_books
SET publisher_address = ROW('123 Book St', 'Libraryville', 'Bookland')
WHERE id = 1;

Composite-Typen helfen Ihnen, verwandte Daten logischer zu organisieren.

Range-Typen

Wenn Sie einen Bereich von Werten darstellen müssen:

CREATE TABLE hotel_bookings (
id serial PRIMARY KEY,
room_number integer,
stay daterange
);

INSERT INTO hotel_bookings (room_number, stay)
VALUES (101, '[2023-07-01, 2023-07-07)');

Der daterange-Typ macht es einfach, Überlappungen von Buchungen zu überprüfen!

Objektidentifikations-Typen

Diese Typen werden intern von PostgreSQL verwendet:

CREATE TABLE table_info (
table_name VARCHAR(50),
oid oid
);

INSERT INTO table_info (table_name, oid)
SELECT 'favorite_books', 'favorite_books'::regclass::oid;

Obwohl Sie diese vielleicht nicht oft verwenden, sind sie für die internen Operationen von PostgreSQL entscheidend.

Pseudo-Typen

Diese sind keineechten Typen, aber sie werden in Funktionsdeklarationen verwendet:

CREATE FUNCTION multiply_any(anyelement, anyelement)
RETURNS anyelement AS $$
SELECT $1 * $2;
$$ LANGUAGE SQL;

SELECT multiply_any(5, 3);  -- Gibt 15 zurück
SELECT multiply_any(5.5, 2);  -- Gibt 11.0 zurück

Pseudo-Typen wie anyelement erlauben flexible Funktionsdefinitionen.

Und das ist es, meine neugierigen Schüler! Wir haben die weite Landschaft der PostgreSQL-Datentypen erkundet. Erinnern Sie sich daran, dass die Auswahl des richtigen Datentyps entscheidend für Leistung, Speicher-effizienz und Datenintegrität ist. Es ist wie das Wahl des richtigen Werkzeugs für die Aufgabe – Sie würden nicht eine Brechstange verwenden, um ein Bild aufzuhängen, oder?

Als Sie Ihre PostgreSQL-Reise fortsetzen, werden Sie noch mehr Nuancen und Tricks mit diesen Datentypen entdecken. Keep experimenting, stay curious, and most importantly, have fun with your databases! Wer weiß, vielleicht werden Sie ja der nächste Datenbank-Zauberer in der Stadt. ?‍♂️?

Nun, gehen Sie los und erstellen Sie großartige Datenbanken! Und denken Sie daran, in der Welt von PostgreSQL hat jeder Datentyp seinen Platz – genau wie jedes Buch seinen perfekten Platz auf einem Bücherregal. Frohes Coden! ??

Credits: Image by storyset