SQLデータベース設計の基礎

リレーショナルデータベースの設計原則とSQLの基本的なクエリについて解説します。

|

SQLデータベース設計の基礎

効率的なデータベース設計とSQLクエリの書き方を学びましょう。

テーブル設計の基本

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

-- 投稿テーブル
CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  user_id INTEGER REFERENCES users(id),
  title VARCHAR(255) NOT NULL,
  content TEXT,
  status VARCHAR(20) DEFAULT 'draft',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- タグテーブル(多対多関係)
CREATE TABLE tags (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE post_tags (
  post_id INTEGER REFERENCES posts(id),
  tag_id INTEGER REFERENCES tags(id),
  PRIMARY KEY (post_id, tag_id)
);

基本的なクエリ

-- 基本的なSELECT
SELECT id, name, email FROM users WHERE created_at > '2025-01-01';

-- JOIN操作
SELECT 
  u.name,
  p.title,
  p.created_at
FROM users u
INNER JOIN posts p ON u.id = p.user_id
WHERE p.status = 'published'
ORDER BY p.created_at DESC;

-- 集計関数
SELECT 
  u.name,
  COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON u.id = p.user_id
GROUP BY u.id, u.name
HAVING COUNT(p.id) > 5;

インデックスの最適化

-- よく検索される列にインデックス
CREATE INDEX idx_posts_user_id ON posts(user_id);
CREATE INDEX idx_posts_status ON posts(status);
CREATE INDEX idx_posts_created_at ON posts(created_at);

-- 複合インデックス
CREATE INDEX idx_posts_user_status ON posts(user_id, status);

トランザクション

BEGIN;

INSERT INTO users (email, name) VALUES ('user@example.com', 'New User');

INSERT INTO posts (user_id, title, content) 
VALUES (LASTVAL(), 'First Post', 'Hello World');

COMMIT;

適切なデータベース設計により、スケーラブルなアプリケーションを構築できます。