PostgreSQL - データ型

こんにちは、未来のデータベース魔法師たち!? PostgreSQLデータ型の世界への興味深い旅へようこそ。近所の親切なコンピュータサイエンスの先生として、この魅力的なトピックをガイドするのを楽しみにしています。プログラミングが初めてであれば安心してください。私たちは基礎から始めて、少しずつ進んでいきます。では、バーチャルの杖(キーボード)を握りしめ、一緒に飛び込んでみましょう!

PostgreSQL - Data Types

数値型

ああ、数値はコンピューティングの基本です!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
);

この例では:

  • idserial を使用し、新しいエントリごとに自動的にインクリメントされます。
  • publication_yearsmallint を使用しています(古い本はあまりありませんね!)。
  • pagesinteger を使用しています。
  • isbnbigint を使用しています。

浮動小数点型

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