SmartFall Docs

Schema Overview

Entity Relationship Diagram for SmartFall database.

ER Diagram

Key Relationships

One-to-Many

  • User → Session: One user has many login sessions
  • User → Patient: One user has one patient profile (if PATIENT role)
  • User → Caregiver: One user has one caregiver profile (if CAREGIVER role)
  • User → Device: One user has multiple devices
  • User → Fall: One user has multiple fall events
  • Device → SensorData: One device has many sensor readings
  • Device → DeviceStatus: One device has one current status
  • Device → DeviceLog: One device has many activity logs
  • User → HealthLog: One user has many health records
  • User → Message: One user sends/receives many messages

Many-to-Many

  • Caregiver ↔ Patient: Implemented via CaregiverPatient junction table

Index Strategy

Indexes optimize common queries:

TableIndexed ColumnsPurpose
UseremailLogin lookups
PatientuserIdFind patient by user
CaregiveruserIdFind caregiver by user
DeviceuserId, macAddressDevice lookups
SensorDatadeviceId, timestampTime-series queries
FalluserId, status, timestampFall event filtering
DeviceLogdeviceId, timestampActivity tracking
MessagesenderId, recipientIdConversation retrieval

Data Consistency

Cascade Behaviors

ActionBehavior
Delete UserCascade: Sessions, Patient/Caregiver profile, Devices, Falls, Messages
Delete DeviceCascade: SensorData, DeviceStatus, DeviceLogs
Delete CaregiverUpdate: CaregiverPatient (set to NULL)

Constraints

  • Email is unique per User
  • MAC address is unique per Device
  • User can have only one Patient and one Caregiver profile
  • Device must have an owner (userId)
  • CaregiverPatient requires valid caregiver and patient IDs

Query Patterns

Find Patient's Devices

SELECT d.* FROM devices d
WHERE d.user_id = $1

Get Recent Sensor Data

SELECT s.* FROM sensor_data s
WHERE s.device_id = $1
  AND s.timestamp > $2
ORDER BY s.timestamp DESC

List High-Risk Patients for Caregiver

SELECT p.* FROM patients p
JOIN caregiver_patients cp ON p.id = cp.patient_id
WHERE cp.caregiver_id = $1
  AND p.risk_score >= 75

Get Unread Messages

SELECT m.* FROM messages m
WHERE m.recipient_id = $1
  AND m.read = false
ORDER BY m.created_at DESC