-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.sql
More file actions
167 lines (135 loc) · 6.93 KB
/
Copy pathdatabase.sql
File metadata and controls
167 lines (135 loc) · 6.93 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
/* ============================================================
BioSentinel AI — Full Database Schema
Engine: MySQL 8.0+
Charset: utf8mb4 (full Unicode + emoji)
============================================================ */
/* ---- Create & Select Database ---- */
CREATE DATABASE IF NOT EXISTS BioSentinelAI
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE BioSentinelAI;
/* ============================================================
USERS
Stores registered user accounts.
============================================================ */
CREATE TABLE IF NOT EXISTS users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(150) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(150) DEFAULT NULL,
role ENUM('admin', 'researcher', 'viewer')
NOT NULL DEFAULT 'researcher',
is_active TINYINT(1) NOT NULL DEFAULT 1,
last_login TIMESTAMP NULL DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_users_email (email),
INDEX idx_users_username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/* ============================================================
UPLOADS
Each row represents one image uploaded by a user.
============================================================ */
CREATE TABLE IF NOT EXISTS uploads (
upload_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
filename VARCHAR(255) NOT NULL, -- UUID-based stored name
original_name VARCHAR(255) NOT NULL, -- original user filename
file_path VARCHAR(512) NOT NULL, -- relative path on disk
file_size INT NOT NULL, -- bytes
mime_type VARCHAR(100) DEFAULT NULL,
status ENUM('pending', 'processing', 'done', 'failed')
NOT NULL DEFAULT 'pending',
uploaded_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
latitude DECIMAL(10, 7) DEFAULT NULL,
longitude DECIMAL(10, 7) DEFAULT NULL,
CONSTRAINT fk_uploads_user
FOREIGN KEY (user_id) REFERENCES users (user_id)
ON DELETE CASCADE ON UPDATE CASCADE,
INDEX idx_uploads_user (user_id),
INDEX idx_uploads_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/* ============================================================
ANALYSES
One row per completed AI analysis of an upload.
============================================================ */
CREATE TABLE IF NOT EXISTS analyses (
analysis_id INT AUTO_INCREMENT PRIMARY KEY,
upload_id INT NOT NULL UNIQUE, -- 1:1 with uploads
user_id INT NOT NULL,
total_animals INT NOT NULL DEFAULT 0,
scene_summary TEXT DEFAULT NULL,
recommendations TEXT DEFAULT NULL,
raw_gemini_json LONGTEXT DEFAULT NULL, -- full Gemini response
yolo_detected INT NOT NULL DEFAULT 0, -- YOLO animal count
yolo_json LONGTEXT DEFAULT NULL, -- YOLO detection results
ai_provider VARCHAR(50) NOT NULL DEFAULT 'gemini',
analyzed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_analyses_upload
FOREIGN KEY (upload_id) REFERENCES uploads (upload_id)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_analyses_user
FOREIGN KEY (user_id) REFERENCES users (user_id)
ON DELETE CASCADE ON UPDATE CASCADE,
INDEX idx_analyses_user (user_id),
INDEX idx_analyses_date (analyzed_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/* ============================================================
DETECTED_ANIMALS
Each row is one species detected within an analysis.
============================================================ */
CREATE TABLE IF NOT EXISTS detected_animals (
animal_id INT AUTO_INCREMENT PRIMARY KEY,
analysis_id INT NOT NULL,
common_name VARCHAR(150) NOT NULL,
scientific_name VARCHAR(200) DEFAULT NULL,
count INT NOT NULL DEFAULT 1,
confidence DECIMAL(5, 4) DEFAULT NULL, -- 0.0000 – 1.0000
conservation_status VARCHAR(100) DEFAULT NULL, -- e.g. 'Endangered'
bounding_boxes LONGTEXT DEFAULT NULL, -- JSON array from YOLO
CONSTRAINT fk_da_analysis
FOREIGN KEY (analysis_id) REFERENCES analyses (analysis_id)
ON DELETE CASCADE ON UPDATE CASCADE,
INDEX idx_da_analysis (analysis_id),
INDEX idx_da_name (common_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/* ============================================================
REPORTS
Tracks generated report files (PDF / CSV / Excel).
============================================================ */
CREATE TABLE IF NOT EXISTS reports (
report_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
analysis_id INT NOT NULL,
report_type ENUM('pdf', 'csv', 'excel', 'conservation')
NOT NULL,
file_path VARCHAR(512) NOT NULL,
file_size INT DEFAULT NULL, -- bytes
generated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_reports_user
FOREIGN KEY (user_id) REFERENCES users (user_id)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_reports_analysis
FOREIGN KEY (analysis_id) REFERENCES analyses (analysis_id)
ON DELETE CASCADE ON UPDATE CASCADE,
INDEX idx_reports_user (user_id),
INDEX idx_reports_analysis (analysis_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/* ============================================================
ALERT RECIPIENTS
Stores email addresses to notify when endangered animals are seen.
============================================================ */
CREATE TABLE IF NOT EXISTS alert_recipients (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
email VARCHAR(150) NOT NULL UNIQUE,
name VARCHAR(150) DEFAULT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_alert_user
FOREIGN KEY (user_id) REFERENCES users (user_id)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;