PostgreSQL - Loại dữ liệu

Xin chào các bạnfuture database wizards! ? Chào mừng các bạn đến với hành trình thú vị vào thế giới các loại dữ liệu của PostgreSQL. Là một giáo viên khoa học máy tính gần gũi, tôi rất vui được hướng dẫn các bạn qua chủ đề hấp dẫn này. Đừng lo lắng nếu bạn mới bắt đầu lập trình - chúng ta sẽ bắt đầu từ những điều cơ bản nhất và dần dần nâng cao. Vậy, hãy lấy cây phép thuật ảo của bạn (bàn phím) và cùng nhau lặn sâu vào!

PostgreSQL - Data Types

Loại số học

Ah, số học - nền tảng của việc tính toán! PostgreSQL cung cấp nhiều loại số học khác nhau để phù hợp với các nhu cầu khác nhau. Hãy cùng khám phá chúng với một số ví dụ thú vị.

Loại số nguyên

PostgreSQL cung cấp bốn loại số nguyên:

Loại Kích thước lưu trữ Phạm vi
smallint 2 bytes -32768 đến +32767
integer 4 bytes -2147483648 đến +2147483647
bigint 8 bytes -9223372036854775808 đến +9223372036854775807
serial 4 bytes 1 đến 2147483647

Hãy tạo một bảng để lưu trữ thông tin về sách yêu thích của chúng ta:

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

Trong ví dụ này:

  • id sử dụng serial, tự động tăng cho mỗi mục mới.
  • publication_year sử dụng smallint vì sách không quá cũ (xin lỗi, các cuốn sách cổ!).
  • pages sử dụng integer cho độ dài sách.
  • isbn sử dụng bigint cho những số ISBN dài.

Loại số động điểm

Để có độ chính xác thập phân:

Loại Mô tả
real 6 chữ số thập phân chính xác
double precision 15 chữ số thập phân chính xác

Hãy thêm một số chi tiết vào bảng sách của chúng ta:

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

Bây giờ chúng ta có thể lưu trữ rating sách (ví dụ: 4.5 sao) và giá cả chính xác.

Loại số chính xác tùy ý

Để có độ chính xác极高:

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

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

numeric(1000, 900) cho phép đến 1000 chữ số tổng cộng và 900 sau dấu phẩy. Hoàn hảo cho những người yêu thích pi!

Loại tiền tệ

Tiền bạc làm cho thế giới quay, và PostgreSQL có đúng loại cho nó:

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

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

Loại money tự động xử lý các ký hiệu tiền tệ và dấu phẩy tách.

Loại ký tự

Văn bản ở khắp mọi nơi trong cơ sở dữ liệu. PostgreSQL cung cấp ba loại ký tự chính:

Loại Mô tả
character(n) Độ dài cố định, điền空白
varchar(n) Độ dài thay đổi với giới hạn
text Độ dài không giới hạn

Hãy sử dụng chúng trong cơ sở dữ liệu sách của chúng ta:

ALTER TABLE favorite_books
ADD COLUMN author character(50),
ADD COLUMN description varchar(500),
ADD COLUMN full_text text;
  • author cố định ở 50 ký tự (hy vọng đủ cho "J.K. Rowling"!).
  • description có thể thay đổi nhưng không vượt quá 500 ký tự.
  • full_text có thể lưu trữ toàn bộ sách nếu muốn (nhưng đừng làm thế, được không?).

Loại dữ liệu nhị phân

Đôi khi, bạn cần lưu trữ dữ liệu nhị phân thô. Đó là khi bytea xuất hiện:

ALTER TABLE favorite_books
ADD COLUMN cover_image bytea;

-- Chèn một hình ảnh (giả định đây là dữ liệu nhị phân thực tế)
UPDATE favorite_books
SET cover_image = '\x89504E470D0A1A0A'
WHERE id = 1;

Điều này cho phép chúng ta lưu trữ ảnh bìa sách trực tiếp trong cơ sở dữ liệu.

Loại ngày/giờ

Thời gian là yếu tố quan trọng, và PostgreSQL có nó:

Loại Mô tả
date Ngày (không có thời gian trong ngày)
time Thời gian trong ngày (không có ngày)
timestamp Cả ngày và giờ
interval Khoảng thời gian

Hãy theo dõi khi chúng ta đọc sách yêu thích:

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;

Bây giờ chúng ta có thể phân tích thói quen đọc sách của mình! ?⏱️

Loại boolean

True hoặc false, 1 hoặc 0, yes hoặc no - đôi khi cuộc sống là nhị phân:

ALTER TABLE favorite_books
ADD COLUMN is_favorite boolean;

UPDATE favorite_books
SET is_favorite = true
WHERE rating > 4.5;

Đơn giản và hiệu quả!

Loại enum

Khi bạn có một bộ các tùy chọn cố định, enum là người bạn tốt:

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;

Không còn lỗi chính tả trong tên thể loại!

Loại hình học

Đối với tất cả những người yêu thích hình học:

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

Hoàn hảo cho việc bản đồ hóa chiến dịch Dungeons & Dragons của bạn!

Loại địa chỉ mạng

Trong thế giới kết nối của chúng ta, việc lưu trữ thông tin mạng là quan trọng:

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

Bây giờ bạn có thể theo dõi tất cả các thiết bị trên mạng của bạn!

Loại chuỗi bit

Đôi khi, bạn chỉ cần làm việc với các bit thô:

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

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

Mỗi bit có thể đại diện cho một quyền khác nhau. Thế nào cho hiệu quả lưu trữ?

Loại tìm kiếm văn bản

PostgreSQL có hỗ trợ tích hợp cho tìm kiếm văn bản:

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

Bây giờ bạn có thể thực hiện các tìm kiếm nhanh chóng trên bộ sưu tập sách của mình!

Loại UUID

UUID là tuyệt vời cho các hệ thống phân tán:

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

Không còn lo lắng về xung đột ID giữa các máy chủ!

Loại XML

Đối với việc lưu trữ dữ liệu XML có cấu trúc:

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 trong cơ sở dữ liệu? Tại sao không!

Loại JSON

Trong kỷ nguyên của các dịch vụ web, JSON là vua:

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;

Loại jsonb cho phép lưu trữ và truy vấn dữ liệu JSON hiệu quả.

Loại mảng

Đôi khi, bạn cần lưu trữ nhiều giá trị trong một cột:

ALTER TABLE favorite_books
ADD COLUMN keywords text[];

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

Mảng cho phép bạn lưu trữ danh sách các giá trị mà không cần tạo bảng riêng.

Loại phức hợp

Tạo các loại tùy chỉnh của bạn bằng cách kết hợp các loại hiện có:

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;

Loại phức hợp giúp bạn tổ chức dữ liệu liên quan một cách logic hơn.

Loại khoảng

Khi bạn cần đại diện cho một khoảng giá trị:

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

Loại daterange giúp bạn dễ dàng kiểm tra các booking trùng lặp!

Loại nhận dạng đối tượng

Các loại này được sử dụng nội bộ bởi 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;

Mặc dù bạn có thể không sử dụng chúng thường xuyên, nhưng chúng rất quan trọng cho các hoạt động nội bộ của PostgreSQL.

Loại giả

Những loại này không phải là loại thực tế, nhưng chúng được sử dụng trong các khai báo hàm:

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

SELECT multiply_any(5, 3);  -- Trả về 15
SELECT multiply_any(5.5, 2);  -- Trả về 11.0

Các loại giả như anyelement cho phép bạn định nghĩa các hàm linh hoạt hơn.

Và thế là xong, các học viên hăng hái của tôi! Chúng ta đã khám phá cảnh quan rộng lớn của các loại dữ liệu PostgreSQL. Nhớ rằng việc chọn đúng loại dữ liệu rất quan trọng cho hiệu suất, hiệu quả lưu trữ và tính toàn vẹn của dữ liệu. Nó giống như việc chọn đúng công cụ cho công việc - bạn wouldn't sử dụng một cây búa để treo một bức ảnh, phải không?

Khi bạn tiếp tục hành trình PostgreSQL của mình, bạn sẽ khám phá thêm nhiều chi tiết và mẹo về các loại dữ liệu này. Hãy tiếp tục thử nghiệm, giữ sự tò mò và quan trọng nhất, hãy vui vẻ với cơ sở dữ liệu của bạn! Ai biết, bạn có thể trở thành phù thủy cơ sở dữ liệu tiếp theo trong thị trấn. ?‍♂️?

Bây giờ, hãy tiến lên và tạo ra những cơ sở dữ liệu tuyệt vời! And remember, trong thế giới của PostgreSQL, mỗi loại dữ liệu đều có vị trí của mình - giống như cách mỗi cuốn sách có vị trí perfect trên kệ sách. Hạnh phúc mã hóa! ??

Credits: Image by storyset