-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathschema.sql
More file actions
170 lines (156 loc) · 5.42 KB
/
schema.sql
File metadata and controls
170 lines (156 loc) · 5.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
-- Asana Simulation Database Schema
-- Designed for SQLite
-- Organizations/Workspaces
CREATE TABLE organizations (
org_id TEXT PRIMARY KEY,
name TEXT NOT NULL,
domain TEXT UNIQUE NOT NULL,
created_at TIMESTAMP NOT NULL,
employee_count INTEGER NOT NULL
);
-- Teams within an organization
CREATE TABLE teams (
team_id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
created_at TIMESTAMP NOT NULL,
FOREIGN KEY (org_id) REFERENCES organizations(org_id)
);
-- Users/Members
CREATE TABLE users (
user_id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
job_title TEXT,
department TEXT,
created_at TIMESTAMP NOT NULL,
is_active BOOLEAN DEFAULT 1,
FOREIGN KEY (org_id) REFERENCES organizations(org_id)
);
-- Team memberships (many-to-many)
CREATE TABLE team_memberships (
membership_id TEXT PRIMARY KEY,
team_id TEXT NOT NULL,
user_id TEXT NOT NULL,
role TEXT CHECK(role IN ('member', 'lead', 'admin')),
joined_at TIMESTAMP NOT NULL,
FOREIGN KEY (team_id) REFERENCES teams(team_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),
UNIQUE(team_id, user_id)
);
-- Projects
CREATE TABLE projects (
project_id TEXT PRIMARY KEY,
team_id TEXT NOT NULL,
name TEXT NOT NULL,
description TEXT,
project_type TEXT CHECK(project_type IN ('sprint', 'ongoing', 'campaign', 'operations')),
status TEXT CHECK(status IN ('active', 'archived', 'on_hold')),
owner_id TEXT,
created_at TIMESTAMP NOT NULL,
due_date DATE,
FOREIGN KEY (team_id) REFERENCES teams(team_id),
FOREIGN KEY (owner_id) REFERENCES users(user_id)
);
-- Sections within projects (e.g., To Do, In Progress, Done)
CREATE TABLE sections (
section_id TEXT PRIMARY KEY,
project_id TEXT NOT NULL,
name TEXT NOT NULL,
position INTEGER NOT NULL,
FOREIGN KEY (project_id) REFERENCES projects(project_id)
);
-- Tasks (includes both top-level tasks and subtasks)
CREATE TABLE tasks (
task_id TEXT PRIMARY KEY,
project_id TEXT NOT NULL,
section_id TEXT,
parent_task_id TEXT, -- NULL for top-level tasks, references task_id for subtasks
name TEXT NOT NULL,
description TEXT,
assignee_id TEXT,
created_by TEXT NOT NULL,
created_at TIMESTAMP NOT NULL,
due_date DATE,
completed BOOLEAN DEFAULT 0,
completed_at TIMESTAMP,
priority TEXT CHECK(priority IN ('low', 'medium', 'high', 'urgent')),
FOREIGN KEY (project_id) REFERENCES projects(project_id),
FOREIGN KEY (section_id) REFERENCES sections(section_id),
FOREIGN KEY (parent_task_id) REFERENCES tasks(task_id),
FOREIGN KEY (assignee_id) REFERENCES users(user_id),
FOREIGN KEY (created_by) REFERENCES users(user_id),
CHECK (completed = 0 OR completed_at IS NOT NULL),
CHECK (completed_at IS NULL OR completed_at >= created_at)
);
-- Comments/Stories on tasks
CREATE TABLE comments (
comment_id TEXT PRIMARY KEY,
task_id TEXT NOT NULL,
user_id TEXT NOT NULL,
content TEXT NOT NULL,
created_at TIMESTAMP NOT NULL,
FOREIGN KEY (task_id) REFERENCES tasks(task_id),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- Custom field definitions (project-specific)
CREATE TABLE custom_field_definitions (
field_id TEXT PRIMARY KEY,
project_id TEXT NOT NULL,
name TEXT NOT NULL,
field_type TEXT CHECK(field_type IN ('text', 'number', 'dropdown', 'date', 'checkbox')),
options TEXT, -- JSON array for dropdown options
FOREIGN KEY (project_id) REFERENCES projects(project_id)
);
-- Custom field values for tasks
CREATE TABLE custom_field_values (
value_id TEXT PRIMARY KEY,
task_id TEXT NOT NULL,
field_id TEXT NOT NULL,
value TEXT,
FOREIGN KEY (task_id) REFERENCES tasks(task_id),
FOREIGN KEY (field_id) REFERENCES custom_field_definitions(field_id),
UNIQUE(task_id, field_id)
);
-- Tags (can be applied across projects)
CREATE TABLE tags (
tag_id TEXT PRIMARY KEY,
org_id TEXT NOT NULL,
name TEXT NOT NULL,
color TEXT,
FOREIGN KEY (org_id) REFERENCES organizations(org_id),
UNIQUE(org_id, name)
);
-- Task-Tag associations (many-to-many)
CREATE TABLE task_tags (
task_id TEXT NOT NULL,
tag_id TEXT NOT NULL,
PRIMARY KEY (task_id, tag_id),
FOREIGN KEY (task_id) REFERENCES tasks(task_id),
FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);
-- Attachments
CREATE TABLE attachments (
attachment_id TEXT PRIMARY KEY,
task_id TEXT NOT NULL,
filename TEXT NOT NULL,
file_type TEXT,
file_size INTEGER,
uploaded_by TEXT NOT NULL,
uploaded_at TIMESTAMP NOT NULL,
url TEXT, -- Simulated URL
FOREIGN KEY (task_id) REFERENCES tasks(task_id),
FOREIGN KEY (uploaded_by) REFERENCES users(user_id)
);
-- Indexes for performance
CREATE INDEX idx_users_org ON users(org_id);
CREATE INDEX idx_teams_org ON teams(org_id);
CREATE INDEX idx_projects_team ON projects(team_id);
CREATE INDEX idx_tasks_project ON tasks(project_id);
CREATE INDEX idx_tasks_assignee ON tasks(assignee_id);
CREATE INDEX idx_tasks_parent ON tasks(parent_task_id);
CREATE INDEX idx_comments_task ON comments(task_id);
CREATE INDEX idx_team_memberships_team ON team_memberships(team_id);
CREATE INDEX idx_team_memberships_user ON team_memberships(user_id);