# SQLite Storage Adapter Schema Documentation

## Tables Overview

### 1. `storage` (Primary Data Storage)
- `key_hash` (TEXT, PRIMARY KEY): SHA-256 hash of the storage key
- `encrypted_value` (BLOB): AES-256 encrypted data value  
- `created_at` (TIMESTAMP): When record was first created
- `updated_at` (TIMESTAMP): When record was last modified
- `created_by` (TEXT): User ID who created the record

### 2. `access_log` (Audit Trail)
- `id` (INTEGER, PRIMARY KEY): Auto-incrementing log ID
- `key_hash` (TEXT): Reference to storage.key_hash
- `operation` (TEXT): CRUD operation performed
- `user_id` (TEXT): Who performed the operation
- `timestamp` (TIMESTAMP): When operation occurred

### 3. `performance_metrics` (New in v1.2)
- `id` (INTEGER, PRIMARY KEY): Auto-incrementing metric ID
- `operation` (TEXT): CRUD operation type
- `execution_time_ms` (INTEGER): Operation duration in milliseconds
- `timestamp` (TIMESTAMP): When operation occurred
- `user_id` (TEXT): Who performed the operation
- `key_hash` (TEXT): Optional reference to storage.key_hash

## Relationships

```mermaid
erDiagram
    storage ||--o{ access_log : "1:N"
    storage ||--o{ performance_metrics : "1:N"
```

## Example Queries

### Get Slow Operations (>500ms)
```sql
SELECT operation, execution_time_ms, user_id 
FROM performance_metrics 
WHERE execution_time_ms > 500
ORDER BY execution_time_ms DESC;
```

### Average Operation Times by Type
```sql
SELECT 
    operation,
    AVG(execution_time_ms) as avg_time,
    COUNT(*) as operation_count
FROM performance_metrics
GROUP BY operation;
```

### Performance Metrics with Storage Metadata
```sql
SELECT 
    pm.operation,
    pm.execution_time_ms,
    s.created_at,
    s.updated_at
FROM performance_metrics pm
LEFT JOIN storage s ON pm.key_hash = s.key_hash;
```

## Version History
- v1.0: Initial schema (storage + access_log)
- v1.1: Added RBAC constraints
- v1.2: Added performance_metrics table