defmodule Microwaveprop.Repo.Migrations.CreateBeaconMeasurements do use Ecto.Migration def change do create table(:beacon_measurements, primary_key: false) do add :id, :binary_id, primary_key: true add :beacon_id, references(:beacons, type: :binary_id, on_delete: :delete_all), null: false add :monitor_id, references(:beacon_monitors, type: :binary_id, on_delete: :delete_all), null: false add :measured_at, :utc_datetime, null: false add :frequency_hz, :bigint, null: false add :integration_s, :integer, null: false add :passband_hz, :float, null: false add :gain_db, :float, null: false add :noise_floor_dbfs, :float, null: false add :signal_peak_dbfs, :float, null: false add :signal_avg_dbfs, :float, null: false add :snr_peak_db, :float, null: false add :snr_avg_db, :float, null: false add :signal_active_fraction, :float, null: false add :propmonitor_version, :string, null: false timestamps(type: :utc_datetime) end # Time-series query patterns: latest-N for one monitor, latest-N for one # beacon, and joint monitor+beacon trends. create index(:beacon_measurements, [:monitor_id, "measured_at DESC"]) create index(:beacon_measurements, [:beacon_id, "measured_at DESC"]) # Idempotency: the client retries on 5xx with the same `measured_at`. A # given monitor cannot legitimately produce two distinct measurements for # the same beacon at the same start-of-window timestamp. create unique_index(:beacon_measurements, [:monitor_id, :beacon_id, :measured_at], name: :beacon_measurements_monitor_beacon_measured_at_idx ) end end