-- 0001_create_users_models.up.sql -- -- DB 接入塊 0/塊 1:建立模型庫持久化的最小集合(users + models)。 -- 對齊 docs/autoflow/04-architecture/database.md §0.3、§4、§5.1。 -- -- 為何第一份 migration 含 users:models.owner_user_id 是 REFERENCES users(id) 的 FK, -- 必須先有 users 表。雛形 users 為 stub(固定 demo-user),但 schema 與 FK 約束第一份就要到位。 -- -- 環境事實(已驗證):PostgreSQL 14.23,已裝 extension 只有 plpgsql。 -- - gen_random_uuid():PG14 內建(pgcrypto 已併入核心),可直接用,不需 CREATE EXTENSION。 -- - CITEXT:未裝。users.email 改用 TEXT,大小寫不敏感唯一改用 functional unique index -- ON lower(email)(塊 1 真正寫 user 落盤前,users 僅為 stub,影響極小)。 -- users(Phase 1 stub;雛形固定 demo-user) CREATE TABLE users ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email TEXT NOT NULL, name TEXT, password_hash TEXT, org_id UUID, roles TEXT[] NOT NULL DEFAULT '{}', created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), deleted_at TIMESTAMPTZ ); -- email 大小寫不敏感唯一(取代 CITEXT,因 PG14.23 未裝 citext extension)。 CREATE UNIQUE INDEX uq_users_email_lower ON users (lower(email)); -- models(塊 1 主體;使用者最關心,重啟後模型庫資料還在) CREATE TABLE models ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), owner_user_id UUID NOT NULL REFERENCES users(id), name TEXT NOT NULL, description TEXT, storage_key TEXT NOT NULL, file_size BIGINT NOT NULL, file_checksum TEXT, faa_object_key TEXT, -- ADR-017 (a) B1,nullable(上傳類留 NULL) target_chip TEXT, input_shape INT[], classes TEXT[], framework TEXT, source TEXT NOT NULL, source_job_id UUID, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), uploaded_at TIMESTAMPTZ, deleted_at TIMESTAMPTZ ); -- owner-scoped index(List by owner / chip / source;只索引未刪除紀錄)。 CREATE INDEX idx_models_owner_active ON models (owner_user_id) WHERE deleted_at IS NULL; CREATE INDEX idx_models_owner_chip_active ON models (owner_user_id, target_chip) WHERE deleted_at IS NULL; CREATE INDEX idx_models_owner_source_active ON models (owner_user_id, source) WHERE deleted_at IS NULL;