データベース

PostgreSQL

概要

PostgreSQLは、30年以上の開発実績を持つ世界で最も先進的なオープンソースのリレーショナルデータベース管理システムです。高い拡張性、標準準拠、堅牢性で知られ、エンタープライズレベルの機能を提供しています。

詳細

PostgreSQLは1986年にカリフォルニア大学バークレー校で始まったプロジェクトから発展し、現在では世界中で広く使用されています。ACID特性を完全にサポートし、完全なSQL標準準拠、外部キー、結合、ビュー、トリガー、ストアドプロシージャに対応しています。また、JSON、XML、配列などの非構造化データ型もサポートし、NoSQLの機能も提供しています。

PostgreSQLは以下の特徴を持ちます:

  • 完全なACID特性(原子性、一貫性、分離性、持続性)
  • マルチバージョン同時実行制御(MVCC)
  • 豊富なデータ型(JSON、XML、配列、範囲型など)
  • 全文検索機能
  • 地理情報システム(PostGIS拡張)
  • カスタム関数とストアドプロシージャ
  • 複数のインデックス型(B-tree、Hash、GiST、SP-GiST、GIN、BRIN)
  • パーティショニング機能
  • レプリケーションとクラスタリング

メリット・デメリット

メリット

  • 高い信頼性: ACID特性とMVCCによる堅牢なトランザクション処理
  • 標準準拠: SQL標準に最も準拠したデータベースの一つ
  • 高い拡張性: カスタムデータ型、関数、演算子の作成が可能
  • 豊富な機能: 地理情報、全文検索、JSON処理など多彩な機能
  • コストパフォーマンス: オープンソースで商用利用も無料
  • 活発なコミュニティ: 継続的な開発とサポート

デメリット

  • 複雑性: 豊富な機能により学習コストが高い
  • メモリ使用量: 大量のメモリを消費する場合がある
  • 設定の複雑さ: 最適なパフォーマンスを得るための調整が必要
  • 初期設定: デフォルト設定では最適化されていない場合がある

主要リンク

書き方の例

インストール・セットアップ

# Ubuntu/Debian
sudo apt update
sudo apt install postgresql postgresql-contrib

# Red Hat/CentOS
sudo yum install postgresql-server postgresql-contrib
sudo postgresql-setup initdb

# macOS (Homebrew)
brew install postgresql
brew services start postgresql

# Docker
docker run --name postgres-db -e POSTGRES_PASSWORD=mypassword -p 5432:5432 -d postgres

基本操作(CRUD)

-- データベース接続
psql -U username -d database_name

-- テーブル作成
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- データ挿入(Create)
INSERT INTO users (name, email) VALUES 
('田中太郎', '[email protected]'),
('佐藤花子', '[email protected]');

-- データ読み取り(Read)
SELECT * FROM users;
SELECT * FROM users WHERE name LIKE '田中%';

-- データ更新(Update)
UPDATE users SET email = '[email protected]' 
WHERE name = '田中太郎';

-- データ削除(Delete)
DELETE FROM users WHERE id = 1;

データモデリング

-- 外部キー制約
CREATE TABLE orders (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    amount DECIMAL(10,2) NOT NULL,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- インデックス作成
CREATE INDEX idx_user_email ON users(email);
CREATE INDEX idx_order_date ON orders(order_date);

-- ビュー作成
CREATE VIEW user_orders AS
SELECT u.name, u.email, o.amount, o.order_date
FROM users u
JOIN orders o ON u.id = o.user_id;

インデックス・最適化

-- 複合インデックス
CREATE INDEX idx_user_date ON orders(user_id, order_date);

-- 部分インデックス
CREATE INDEX idx_active_users ON users(id) WHERE active = true;

-- 実行計画の確認
EXPLAIN ANALYZE SELECT * FROM users WHERE email = '[email protected]';

-- 統計情報の更新
ANALYZE users;

-- バキューム実行
VACUUM ANALYZE users;

実用例

-- JSON型の使用
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    attributes JSONB
);

INSERT INTO products (name, attributes) VALUES 
('ノートPC', '{"brand": "Dell", "cpu": "Intel i7", "ram": "16GB"}');

SELECT * FROM products 
WHERE attributes->>'brand' = 'Dell';

-- 配列型の使用
CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    title VARCHAR(200),
    tags TEXT[]
);

INSERT INTO articles (title, tags) VALUES 
('PostgreSQL入門', ARRAY['database', 'postgresql', 'sql']);

SELECT * FROM articles 
WHERE 'postgresql' = ANY(tags);

-- ウィンドウ関数
SELECT 
    name, 
    amount,
    ROW_NUMBER() OVER (ORDER BY amount DESC) as rank
FROM orders o
JOIN users u ON o.user_id = u.id;

ベストプラクティス

-- トランザクション管理
BEGIN;
INSERT INTO users (name, email) VALUES ('新規ユーザー', '[email protected]');
INSERT INTO orders (user_id, amount) VALUES (LASTVAL(), 1000.00);
COMMIT;

-- ストアドプロシージャ
CREATE OR REPLACE FUNCTION get_user_order_total(user_id_param INTEGER)
RETURNS DECIMAL AS $$
BEGIN
    RETURN (
        SELECT COALESCE(SUM(amount), 0)
        FROM orders 
        WHERE user_id = user_id_param
    );
END;
$$ LANGUAGE plpgsql;

-- パーティショニング
CREATE TABLE orders_2024 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');

-- 接続プール設定
-- postgresql.conf
max_connections = 100
shared_buffers = 256MB
effective_cache_size = 1GB