CREATE TABLE IF NOT EXISTS buckets ( id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, owner_id INT NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE TABLE IF NOT EXISTS objects ( id BIGSERIAL PRIMARY KEY, bucket_id INT NOT NULL REFERENCES buckets(id) ON DELETE CASCADE, key TEXT NOT NULL, size_bytes BIGINT NOT NULL, content_type TEXT, last_modified TIMESTAMPTZ DEFAULT NOW(), version_id TEXT UNIQUE, md5_checksum TEXT, custom_metadata JSONB DEFAULT '{}', UNIQUE (bucket_id, key) ); CREATE INDEX IF NOT EXISTS idx_objects_bucket_id_key ON objects (bucket_id, key); CREATE INDEX IF NOT EXISTS idx_objects_bucket_id_last_modified ON objects (bucket_id, last_modified DESC); CREATE INDEX IF NOT EXISTS idx_objects_custom_metadata_gin ON objects USING GIN (custom_metadata);