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