Use firstOrCreate instead of create so db:seed can run safely on container restart without duplicate key violation.
4.5 KiB
4.5 KiB
Database Schema
Tables
station
Primary table storing telemetry station metadata.
| Column | Type | Description |
|---|---|---|
stationid |
varchar (PK) |
Unique station identifier (e.g., "KBLG0026") |
name |
varchar(255) |
Station display name |
district |
varchar(255) |
District location |
lng |
float |
Longitude coordinate |
lat |
float |
Latitude coordinate |
mainriverbasin |
varchar(255) |
Main river basin name |
subriverbasin |
varchar(255) |
Sub river basin name |
rainfall |
integer |
Has rainfall sensor (1=yes, 0=no) |
waterlevel |
integer |
Has water level sensor (1=yes, 0=no) |
siren |
integer (nullable) |
Has siren (1=yes, 0=no) |
cctv_link |
varchar(500) (nullable) |
URL to CCTV feed |
rainfall
Stores rainfall readings from telemetry stations.
| Column | Type | Description |
|---|---|---|
id |
bigint (PK, auto) |
Auto-increment ID |
stationid |
varchar |
Station identifier (FK to station) |
timestamp |
timestamp |
Reading timestamp |
anncum |
double |
Annual cumulative rainfall |
daily |
double |
Daily cumulative rainfall |
hourly |
double |
Hourly rainfall |
currentrf |
double |
Current rainfall |
battery |
double |
Battery voltage |
waterlevel
Stores water level readings with threshold values.
| Column | Type | Description |
|---|---|---|
id |
bigint (PK, auto) |
Auto-increment ID |
stationid |
varchar |
Station identifier (FK to station) |
datetime |
timestamp |
Reading timestamp |
waterlevel |
double |
Current water level (meters) |
alert |
double |
Alert threshold level |
warning |
double |
Warning threshold level |
danger |
double |
Danger threshold level |
siren
Stores siren activation records.
| Column | Type | Description |
|---|---|---|
id |
bigint (PK, auto) |
Auto-increment ID |
stationid |
varchar |
Station identifier (FK to station) |
stationtype |
varchar |
Station type identifier |
active_time |
timestamp |
Siren activation time |
level |
varchar |
Siren level (H=Danger, L=Warning, N=Normal) |
notification
Stores threshold-exceeded alert records.
| Column | Type | Description |
|---|---|---|
id |
bigint (PK, auto) |
Auto-increment ID |
stationid |
varchar |
Station identifier (FK to station) |
timestamp |
timestamp |
Alert timestamp |
stationtype |
integer |
Type: 1=rainfall, 2=waterlevel, 3=siren |
level |
varchar |
Alert level (Alert, Warning, Danger) |
active_time |
timestamp (nullable) |
Activation time |
users
Stores application users.
| Column | Type | Description |
|---|---|---|
id |
bigint (PK, auto) |
Auto-increment ID |
name |
varchar(255) |
Username |
email |
varchar(255) (unique) |
Email address |
email_verified_at |
timestamp (nullable) |
Email verification timestamp |
password |
varchar(255) |
Bcrypt-hashed password |
access_level |
integer |
1=Admin, 2=User |
is_blocked |
boolean |
Account blocked status |
login_attempts |
integer |
Failed login attempt count |
remember_token |
varchar |
Remember me token |
created_at, updated_at |
timestamp |
Laravel timestamps |
Laravel Standard Tables
password_reset_tokens— Password reset tokenssessions— Database-backed sessionscache/cache_locks— Cache storejobs/job_batches/failed_jobs— Queue systemmigrations— Migration tracking
Relationships
station (1) ──< (many) rainfall via stationid
station (1) ──< (many) waterlevel via stationid
station (1) ──< (many) siren via stationid
station (1) ──< (many) notification via stationid
Note: No database-level foreign keys or constraints exist. All relationships are maintained at the application level.
Indexes
users.email— unique indexsessions.last_activity— indexsessions.user_id— index- No additional indexes on data tables (potential performance concern)
Default Data
Default Admin User
Created via DatabaseSeeder and migration 2025_12_11_124201_add_default_user_to_users_table.php:
- Username:
admin(seeder) /admin(migration) - Email:
admin@example.com - Password:
password123 - Access Level: 1 (Admin)
Note: The admin user is created in both the seeder AND a migration, which would cause a duplicate key error if both run.