PostgreSQL - 데이터 타입

안녕하세요, 미래의 데이터베이스 마법사 여러분! ? PostgreSQL 데이터 타입의 흥미로운 여정에 오신 것을 환영합니다. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 이 fascineting 주제를 안내해 드리게 되어 기쁩니다. 프로그래밍에 처음이라면 걱정하지 마세요 - 우리는 기본부터 차근차근 진행하겠습니다. 그럼, 가상의魔杖( 키보드)을 잡고 함께 빠져들어 보세요!

PostgreSQL - Data Types

数值 타입

아, 숫자 - 컴퓨팅의 기본 블록입니다! PostgreSQL은 다양한 수치 타입을 제공하여 다양한 용도에 맞게 사용할 수 있습니다. 재미있는 예제를 통해 탐색해 보겠습니다.

정수 타입

PostgreSQL은 다음과 같은 네 가지 정수 타입을 제공합니다:

타입 저장 크기 범위
smallint 2 bytes -32768 to +32767
integer 4 bytes -2147483648 to +2147483647
bigint 8 bytes -9223372036854775808 to +9223372036854775807
serial 4 bytes 1 to 2147483647

우리의 좋아하는 책에 대한 정보를 저장할 테이블을 생성해 보겠습니다:

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

이 예제에서:

  • idserial을 사용하여 각 새로운 항목에 대해 자동으로 증가합니다.
  • publication_yearsmallint를 사용합니다. 책은 그렇게 오래되지 않았으니까요 (죄송합니다, 고대의 스크롤들에게요!).
  • pagesinteger를 사용합니다. 책의 길이를 나타냅니다.
  • isbnbigint를 사용합니다. 긴 ISBN 번호를 위한 것입니다.

부동소수점 타입

소수점 정밀도가 필요할 때 사용합니다:

타입 설명
real 6 자리 소수점 정밀도
double precision 15 자리 소수점 정밀도

우리의 책 테이블에 추가 정보를 추가해 보겠습니다:

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

이제 책 평점(예: 4.5 별)과 정확한 가격을 저장할 수 있습니다.

임의 정밀도 수

극도로 정밀한 수치가 필요할 때 사용합니다:

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 애호가들에게 완벽합니다!

화폐 타입

돈은 세상을 돌리는 것입니다. PostgreSQL은 화폐 타입을 제공합니다:

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

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

money 타입은 통화 기호와 쉼표 구분을 자동으로 처리합니다.

문자 타입

데이터베이스에 문자는无处不在합니다. 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자리입니다 ( hope that's enough for "J.K. Rowling"!).
  • description은 가변 길이이지만 500자리를 초과하지 않습니다.
  • full_text는 전체 책을 저장할 수 있지만, 그럴 필요는 없겠지요?

이진 데이터 타입

원시 이진 데이터를 저장할 때 사용합니다:

ALTER TABLE favorite_books
ADD COLUMN cover_image bytea;

-- 이미지를 삽입합니다 (이것이 실제 이진 데이터라고 가정해요)
UPDATE favorite_books
SET cover_image = '\x89504E470D0A1A0A'
WHERE id = 1;

이를 통해 책 표지 이미지를 데이터베이스에 직접 저장할 수 있습니다.

날짜/시간 타입

시간은 중요한 요소입니다. 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;

이제 우리의 독서 습관을 분석할 수 있습니다! ?⏱️

부울 타입

참 또는 거짓, 1 또는 0, 예 또는아니요 - 가끔 생활은 이진입니다:

ALTER TABLE favorite_books
ADD COLUMN is_favorite boolean;

UPDATE favorite_books
SET is_favorite = true
WHERE rating > 4.5;

간단하고 효과적입니다!

열거 타입

고정된 옵션을 가질 때 유용합니다:

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;

이제 장르 이름에 대한 타이포그래피가 없습니다!

기하 타입

형태에 대한 열정을 가진 사람들을 위한 것입니다:

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

당신의 던전 앤 드래곤 캠페인을 지도하는 데 완벽합니다!

네트워크 주소 타입

우리의 연결된 세상에서 네트워크 정보를 저장하는 것은 중요합니다:

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

이제 네트워크 장치를 추적할 수 있습니다!

비트 문자열 타입

raw bits로 작업할 때 사용합니다:

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

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

각 비트는 다른 권한을 나타낼 수 있습니다. 얼마나 효율적인 저장인가요?

텍스트 검색 타입

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 타입

유니버설 유니크 식별자는 분산 시스템에 매우 유용합니다:

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 타입

구조화된 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을 저장할 수 있나요? 왜 안되죠!

JSON 타입

웹 서비스 시대에 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 데이터의 효율적인 저장과 검색을 허용합니다.

배열 타입

한 개의 열에 여러 값을 저장해야 할 때 사용합니다:

ALTER TABLE favorite_books
ADD COLUMN keywords text[];

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

배열을 통해 값을 별도의 테이블을 생성하지 않고도 저장할 수 있습니다.

복합 타입

기존 타입을 결합하여 사용자 정의 타입을 생성합니다:

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;

복합 타입은 관련 데이터를 더 논리적으로 정리하는 데 도움이 됩니다.

범위 타입

값의 범위를 나타내는 데 사용합니다:

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 타입은 예약이 겹치는지 확인하는 데 유용합니다!

객체 식별자 타입

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의 내부 운영에 매우 중요합니다.

가상 타입

이들은 실제 타입이 아니지만 함수 선언에 사용됩니다:

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

SELECT multiply_any(5, 3);  -- Returns 15
SELECT multiply_any(5.5, 2);  -- Returns 11.0

가상 타입은 함수 정의에 더 많은 유연성을 제공합니다.

그리고 여러분! PostgreSQL 데이터 타입의 방대한 세계를 탐험했습니다. 적절한 데이터 타입을 선택하는 것은 성능, 저장 공간 효율성, 데이터 일관성에 매우 중요합니다. 올바른 도구를 선택하지 않으면 벽을 치는 것과 같습니다.

당신의 PostgreSQL 여정을 계속하면서, 이 데이터 타입의 더 많은 미세한 차이와 트릭을 발견할 것입니다. 실험을 계속하고, 호기심을 유지하며, 데이터베이스에乐趣을 느껴보세요! 누구나 다음 데이터베이스 마법사가 될 수 있습니다. ?‍♂️?

이제 놀라운 데이터베이스를 만들어 나가세요! 그리고 PostgreSQL에서 모든 데이터 타입이 자리를 잡는 것처럼, 책이 도서관的书架上 자리를 잡는 것처럼 기억하세요. 즐거운 코딩 되세요! ??

Credits: Image by storyset