PostgreSQL - Типы данных

Привет, будущие маги баз данных! ? Добро пожаловать в наше захватывающее путешествие в мир типов данных PostgreSQL. Как ваш добросердечный сосед по компьютерным наукам, я рад помочь вам изучить эту fascynating тему. Не волнуйтесь, если вы новички в программировании – мы начнем с самых азов и будем подниматься постепенно. Так что возьмите свою виртуальную палочку (клавиатуру), и давайте окунемся в это!

PostgreSQL - Data Types

Numeric Types

О, числа – основа компьютинга! PostgreSQL предлагает разнообразие числовых типов для удовлетворения различных потребностей. Давайте исследуем их с помощью забавных примеров.

Integer Types

PostgreSQL предоставляет четыре типа целых чисел:

Тип Размер хранения Диапазон
smallint 2 байта -32768 до +32767
integer 4 байта -2147483648 до +2147483647
bigint 8 байтов -9223372036854775808 до +9223372036854775807
serial 4 байта 1 до 2147483647

Давайте создадим таблицу для хранения информации о наших любимых книгах:

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

В этом примере:

  • id использует serial, который автоматически увеличивается для каждого новогоentries.
  • publication_year использует smallint, так как книги не так стары (извините, древние свитки!).
  • pages использует integer для длины книг.
  • isbn использует bigint для этих длинных номеров ISBN.

Floating-Point Types

Для тех, кому нужна десятичная точность:

Тип Описание
real 6 десятичных знаков точности
double precision 15 десятичных знаков точности

Давайте добавим немного больше деталей к нашей таблице книг:

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

Теперь мы можем хранить рейтинги книг (например, 4.5 звезды) и точные цены.

Arbitrary Precision Numbers

Для тех, кому нужна极端ная точность:

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

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

numeric(1000, 900) позволяет до 1000 общих знаков с 900 после десятичной точки. Идеально для любителей pi!

Monetary Types

Деньги делают мир вертится, и PostgreSQL имеет正好 подходящий тип для этого:

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

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

Тип money автоматически обрабатывает символы валюты и разделители- запятые.

Character Types

Текст повсюду в базах данных. PostgreSQL предлагает три основных типа символов:

Тип Описание
character(n) Фиксированная длина, заполнение пробелами
varchar(n) Переменная длина с ограничением
text Переменная неограниченная длина

Давайте используем их в нашей базе данных книг:

ALTER TABLE favorite_books
ADD COLUMN author character(50),
ADD COLUMN description varchar(500),
ADD COLUMN full_text text;
  • author фиксирован на 50 символов (надеюсь, это достаточно для "J.K. Rowling"!).
  • description может варьироваться, но не превысит 500 символов.
  • full_text может хранить целую книгу, если мы захотим (но давайте не будем, ладно?).

Binary Data Types

Иногда вам нужно хранить сырые двоичные данные. Вот и enters bytea:

ALTER TABLE favorite_books
ADD COLUMN cover_image bytea;

-- Вставка изображения (предположим, это реальные двоичные данные)
UPDATE favorite_books
SET cover_image = '\x89504E470D0A1A0A'
WHERE id = 1;

Это позволяет нам хранить обложки книг напрямую в базе данных.

Date/Time Types

Время важно, и PostgreSQL это покрывает:

Тип Описание
date Дата (без времени суток)
time Время суток (без даты)
timestamp И дата, и время
interval Временной интервал

Давайте отслеживаем, когда мы читали наши любимые книги:

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;

Теперь мы можем анализировать наши привычки чтения! ?⏱️

Boolean Type

Истинно или ложно, 1 или 0, да или нет – иногда жизнь бинарна:

ALTER TABLE favorite_books
ADD COLUMN is_favorite boolean;

UPDATE favorite_books
SET is_favorite = true
WHERE rating > 4.5;

Просто и эффективно!

Enumerated Type

Когда у вас есть фиксированный набор вариантов, перечисления – ваш друг:

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;

Теперь не будет опечаток в названиях жанров!

Geometric Types

Для всех вас, любители форм:

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))');

Идеально для картографирования вашей кампании Dungeons & Dragons!

Network Address Type

В нашем взаимосвязанном мире хранение сетевой информации至关重要:

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');

Теперь вы можете отслеживать все устройства в вашей сети!

Bit String Type

Иногда вам просто нужно работать с сырыми битами:

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

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

Каждый бит может представлять собой разное разрешение. Как это эффективно!

Text Search Type

PostgreSQL имеет встроенную поддержку полнотекстового поиска:

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);

Теперь вы можете выполнять молниеносные поиски в вашей коллекции книг!

UUID Type

Универсальные уникальные идентификаторы великолепны для распределенных систем:

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');

Теперь не нужно беспокоиться о столкновениях ID на разных серверах!

XML Type

Для тех, кому нужно хранить структурированные данные XML:

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 в базе данных? Why not!

JSON Type

В эпоху веб-сервисов JSON правит балом:

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;

Тип jsonb позволяет для эффективного хранения и запроса JSON данных.

Array Type

Иногда вам нужно хранить несколько значений в одной колонке:

ALTER TABLE favorite_books
ADD COLUMN keywords text[];

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

Массивы позволяют вам хранить списки значений без создания отдельных таблиц.

Composite Types

Создайте свои собственные пользовательские типы, комбинируя существующие:

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;

Композитные типы помогают вам логически организовать связанные данные.

Range Types

Когда вам нужно представить диапазон значений:

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)');

Тип daterange позволяет легко проверять重叠ающиеся бронирования!

Object Identifier Types

Эти типы используются внутренне PostgreSQL:

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

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

Хотя вы можете не использовать их часто, они критически важны для внутренних операций PostgreSQL.

Pseudo-Types

Эти типы не являются реальными, но они используются в объявлениях функций:

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

SELECT multiply_any(5, 3);  -- Возвращает 15
SELECT multiply_any(5.5, 2);  -- Возвращает 11.0

Псевдотипы, такие как anyelement, позволяют для более гибких определений функций.

И вот мы и arrived, мои eager студенты! Мы исследовали обширный ландшафт типов данных PostgreSQL. Помните, что выбор правильного типа данных критически важен для производительности, эффективности хранения и целостности данных. Это как выбирать правильный инструмент для работы – вы бы не использовали кувалду для подвешивания картины, не так ли?

Пока вы продолжаете свое путешествие в PostgreSQL, вы откроете для себя еще больше нюансов и трюков с этими типами данных. Продолжайте экспериментировать, stay curious, и, что самое главное, получайте удовольствие от работы с базами данных! Кто знает, может быть, вы станете следующим магом баз данных в вашем городе. ?‍♂️?

Теперь идите и создавайте потрясающие базы данных! И помните, в мире PostgreSQL, каждый тип данных находит свое место – как каждая книга находит свое место на полке библиотеки. Счастливого кодирования! ??

Credits: Image by storyset