agrovision / supabase /migrations /0001_init.sql
alexp97's picture
feat(db): persistencia Supabase BYOK - migraciones PostGIS/RLS + repos async (Fase 2)
8d80da2
Raw
History Blame Contribute Delete
2.48 kB
-- =====================================================================================
-- AgroVisión — Migración inicial (Fase 2): extensiones, tablas e índices.
-- Idempotente (if not exists). Deriva de docs/db/diseno_db.md.
-- Nota BYOK monousuario: user_id es uuid SIN FK a auth.users (no usamos Supabase Auth;
-- la conexión es directa por DATABASE_URL). plant_counts y la cola PGMQ se crean pero
-- quedan INACTIVAS (módulo de Conteo en desarrollo).
-- =====================================================================================
create extension if not exists postgis; -- geometría/geografía
create extension if not exists pgmq; -- cola del conteo (EN DESARROLLO, inactiva)
-- 1. Parcelas / lotes agrícolas
create table if not exists fields (
id uuid primary key default gen_random_uuid(),
user_id uuid, -- propietario (sin FK: BYOK monousuario)
name text not null,
geom geometry(Polygon, 4326) not null, -- WGS84
created_at timestamptz default now()
);
create index if not exists fields_geom_gist_idx on fields using gist (geom);
-- 2. Serie temporal NDVI (Sentinel-2), agregada por mes
create table if not exists ndvi_timeseries (
id serial primary key,
field_id uuid references fields(id) on delete cascade,
date date not null,
mean_ndvi double precision not null,
min_ndvi double precision,
max_ndvi double precision,
cloud_cover double precision,
source text default 'sentinel2',
constraint unique_field_date unique (field_id, date)
);
create index if not exists ndvi_field_date_idx on ndvi_timeseries (field_id, date);
-- 3. Conteos por dron (EN DESARROLLO: sin escrituras hasta COUNTING_ENABLED=true)
create table if not exists plant_counts (
id serial primary key,
user_id uuid,
field_id uuid references fields(id) on delete set null,
image_url text not null,
count integer not null check (count >= 0),
result_json jsonb,
processed_at timestamptz default now()
);
create index if not exists plant_counts_json_gin_idx on plant_counts using gin (result_json);
-- 4. Memoria conversacional del agente RAG
create table if not exists chat_messages (
id serial primary key,
user_id uuid,
session_id text not null,
role text not null check (role in ('user', 'assistant')),
content text not null,
created_at timestamptz default now()
);
create index if not exists chat_session_history_idx on chat_messages (session_id, created_at);