258 lines
7.8 KiB
SQL
258 lines
7.8 KiB
SQL
-- 001_initial.sql
|
|
-- シンプルグループウェア 初期スキーマ
|
|
-- 全16テーブル + インデックス
|
|
|
|
-- 1. users: システム利用ユーザー
|
|
CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
email TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT,
|
|
avatar_url TEXT,
|
|
role TEXT NOT NULL DEFAULT 'member',
|
|
status TEXT NOT NULL DEFAULT 'active',
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
|
|
-- 2. projects: プロジェクト
|
|
CREATE TABLE projects (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
description TEXT,
|
|
status TEXT NOT NULL DEFAULT 'active',
|
|
owner_id INTEGER NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (owner_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 3. project_members: プロジェクトメンバー
|
|
CREATE TABLE project_members (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
user_id INTEGER NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'member',
|
|
joined_at TEXT NOT NULL,
|
|
UNIQUE(project_id, user_id),
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- 4. board_threads: 掲示板スレッド
|
|
CREATE TABLE board_threads (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
body_md TEXT NOT NULL,
|
|
author_id INTEGER NOT NULL,
|
|
category TEXT,
|
|
is_pinned INTEGER NOT NULL DEFAULT 0,
|
|
is_important INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (author_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 5. board_comments: 掲示板コメント
|
|
CREATE TABLE board_comments (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
thread_id INTEGER NOT NULL,
|
|
author_id INTEGER NOT NULL,
|
|
body_md TEXT NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (thread_id) REFERENCES board_threads(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (author_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 6. chat_messages: チャットメッセージ
|
|
CREATE TABLE chat_messages (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
author_id INTEGER NOT NULL,
|
|
body TEXT NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (author_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 7. todo_columns: ToDoカラム
|
|
CREATE TABLE todo_columns (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
name TEXT NOT NULL,
|
|
order_index INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- 8. todo_items: ToDoタスク
|
|
CREATE TABLE todo_items (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
column_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
assignee_id INTEGER,
|
|
creator_id INTEGER NOT NULL,
|
|
priority TEXT NOT NULL DEFAULT 'normal',
|
|
start_date TEXT,
|
|
due_date TEXT,
|
|
completed_at TEXT,
|
|
order_index INTEGER NOT NULL DEFAULT 0,
|
|
milestone_id INTEGER,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (column_id) REFERENCES todo_columns(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (assignee_id) REFERENCES users(id),
|
|
FOREIGN KEY (creator_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 9. file_assets: ファイルアセット
|
|
CREATE TABLE file_assets (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
uploader_id INTEGER NOT NULL,
|
|
filename TEXT NOT NULL,
|
|
original_name TEXT NOT NULL,
|
|
mime_type TEXT NOT NULL,
|
|
size INTEGER NOT NULL,
|
|
path TEXT NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (uploader_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 10. project_notes: Markdownメモ
|
|
CREATE TABLE project_notes (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
body_md TEXT NOT NULL,
|
|
tags TEXT,
|
|
is_pinned INTEGER NOT NULL DEFAULT 0,
|
|
created_by_id INTEGER NOT NULL,
|
|
updated_by_id INTEGER NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (created_by_id) REFERENCES users(id),
|
|
FOREIGN KEY (updated_by_id) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE INDEX idx_project_notes_project_id ON project_notes(project_id);
|
|
CREATE INDEX idx_project_notes_updated_at ON project_notes(updated_at);
|
|
|
|
-- 11. milestones: マイルストーン
|
|
CREATE TABLE milestones (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
due_date TEXT,
|
|
status TEXT NOT NULL DEFAULT 'open',
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- 12. calendar_events: カレンダーイベント
|
|
CREATE TABLE calendar_events (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
type TEXT NOT NULL,
|
|
start_at TEXT NOT NULL,
|
|
end_at TEXT,
|
|
created_by_id INTEGER NOT NULL,
|
|
related_todo_id INTEGER,
|
|
related_milestone_id INTEGER,
|
|
related_meeting_id INTEGER,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (created_by_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 13. meetings: ミーティング
|
|
CREATE TABLE meetings (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
location TEXT,
|
|
meeting_url TEXT,
|
|
start_at TEXT NOT NULL,
|
|
end_at TEXT NOT NULL,
|
|
agenda_md TEXT,
|
|
minutes_md TEXT,
|
|
created_by_id INTEGER NOT NULL,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL,
|
|
deleted_at TEXT,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (created_by_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 14. meeting_members: ミーティング参加メンバー
|
|
CREATE TABLE meeting_members (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
meeting_id INTEGER NOT NULL,
|
|
user_id INTEGER NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'invited',
|
|
UNIQUE(meeting_id, user_id),
|
|
FOREIGN KEY (meeting_id) REFERENCES meetings(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
);
|
|
|
|
-- 15. notifications: 通知
|
|
CREATE TABLE notifications (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER NOT NULL,
|
|
project_id INTEGER,
|
|
type TEXT NOT NULL,
|
|
title TEXT NOT NULL,
|
|
body TEXT,
|
|
read_at TEXT,
|
|
created_at TEXT NOT NULL,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- 16. activity_logs: アクティビティログ
|
|
CREATE TABLE activity_logs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
project_id INTEGER NOT NULL,
|
|
actor_id INTEGER NOT NULL,
|
|
action TEXT NOT NULL,
|
|
target_type TEXT NOT NULL,
|
|
target_id INTEGER,
|
|
metadata_json TEXT,
|
|
created_at TEXT NOT NULL,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (actor_id) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE INDEX idx_activity_logs_project_id ON activity_logs(project_id);
|
|
CREATE INDEX idx_activity_logs_created_at ON activity_logs(created_at);
|
|
CREATE INDEX idx_notifications_user_id ON notifications(user_id);
|
|
CREATE INDEX idx_chat_messages_project_id ON chat_messages(project_id);
|
|
CREATE INDEX idx_board_threads_project_id ON board_threads(project_id);
|
|
CREATE INDEX idx_todo_items_project_id ON todo_items(project_id);
|
|
CREATE INDEX idx_meetings_project_id ON meetings(project_id);
|
|
CREATE INDEX idx_calendar_events_project_id ON calendar_events(project_id);
|