Zapytałem więc to pytanie na Postgre> , jako sugerowane przez Craiga Ringera i mam odpowiedź.
W skrócie rozwiązaniem jest napisanie procedury, która materializuje tablicę JSON w tablicy PostgreSQL:
create function data_product_ids(JSON) returns integer[] immutable as $$
select array_agg((a->>'product_id')::integer) from
json_array_elements($1->'products') as a $$ language sql ;
i użyj tej procedury w CHECK
oświadczenie:
alter table orders add check (1 <= ALL(data_product_ids(data)));
Aby uzyskać więcej informacji na temat tego, jak to działa, zobacz odpowiedź na Lista mailingowa PostgreSQL . Kredyty dla Joela Hoffmana.