PostgreSQL - データ型
こんにちは、未来のデータベース魔法師たち!? PostgreSQLデータ型の世界への興味深い旅へようこそ。近所の親切なコンピュータサイエンスの先生として、この魅力的なトピックをガイドするのを楽しみにしています。プログラミングが初めてであれば安心してください。私たちは基礎から始めて、少しずつ進んでいきます。では、バーチャルの杖(キーボード)を握りしめ、一緒に飛び込んでみましょう!
数値型
ああ、数値はコンピューティングの基本です!PostgreSQLはさまざまなニーズに対応する数値型を提供しています。楽しい例で一緒に見ていきましょう。
整数型
PostgreSQLは以下の4つの整数型を提供しています:
タイプ | ストレージサイズ | 範囲 |
---|---|---|
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
を使用し、新しいエントリごとに自動的にインクリメントされます。 -
publication_year
はsmallint
を使用しています(古い本はあまりありませんね!)。 -
pages
はinteger
を使用しています。 -
isbn
はbigint
を使用しています。
浮動小数点型
10進数の精度が必要な場合に使用します:
タイプ | 説明 |
---|---|
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桁までの精度を許可します。πの愛好家には完璧です!
通貨型
お金は世界を回らせます。PostgreSQLにはそのための型があります:
CREATE TABLE product_prices (
product_name VARCHAR(50),
price money
);
INSERT INTO product_prices (product_name, price)
VALUES ('高級ペン', '$9.99');
money
型は通貨符号とカンマの区切りを自動的に処理します。
文字列型
データベースにはどこにでもテキストがあります。PostgreSQLは以下の3つの主要な文字列型を提供しています:
タイプ | 説明 |
---|---|
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
は全文を保存できるように無制限です(でも全部の本を保存するのはどうでしょうか?)。
バイナリデータ型
ときには(raw)バイナリデータを保存する必要があります。bytea
が役立ちます:
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 ('私の家', '(10,20)', '((0,0),(100,100))');
Dungeons & Dragonsのキャンペーンマップに最適!
ネットワークアドレス型
私たちの繋がれた世界では、ネットワーク情報を保存することが重要です:
CREATE TABLE network_devices (
id serial PRIMARY KEY,
name VARCHAR(50),
ip inet,
mac macaddr
);
INSERT INTO network_devices (name, ip, mac)
VALUES ('私のルーター', '192.168.1.1', '08:00:2b:01:02:03');
ネットワーク上のすべてのデバイスを追跡できます!
ビット文字列型
ときには生のビットを扱う必要があります:
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 ('分布式データ');
サーバー間での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>あなたの好きな先生</author>
</book>'
);
データベースにXMLを保存する?なぜしない!
JSON型
ウェブサービスの时代では、JSONが王様です:
ALTER TABLE favorite_books
ADD COLUMN metadata jsonb;
UPDATE favorite_books
SET metadata = '{"tags": ["education", "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)');
重複する予約を確認するのに便利です!
オブジェクト識別子型
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); -- 15を返します
SELECT multiply_any(5.5, 2); -- 11.0を返します
anyelement
などの擬似型は、より柔軟な関数定義を可能にします。
そして、皆さん!PostgreSQLデータ型の広大な世界を探求しました。適切なデータ型を選ぶことは、パフォーマンス、ストレージ効率、データの整合性にとって非常に重要です。適切な道具を選ぶのと同じで、絵を描くのにはハンマーは使えませんよね?
PostgreSQLの旅を続ける中で、データ型の更多の细微な違いや技巧を発見するでしょう。実験を続け、好奇心を持ち、そしてデータベースを楽しみましょう!あなたが次のデータベース魔法師になるかもしれません。?♂️?
さあ、素晴らしいデータベースを作成去吧!そして、PostgreSQLの世界では、すべてのデータ型が適切な場所があります。本棚の棚に本が適切に並ぶのと同じです。ハッピーコーディング!??
Credits: Image by storyset