Можно ли задать внешний ключ в JSON-поле PostgreSQL?

Можно ли привязать ключи к JSON-полю к другим таблицам?

Пример: поле data вида {"parameter1": value1, "parameter2": value2}. При этом, если есть значение parameter1, то оно должно быть привязано к определённой таблице, и соответственно значение не может быть «абы какое», а подвязано именно к другой таблице.

Делается ли такое вообще в JSON-полях на уровне ядра СУБД, без написания вручную кода проверок в обход базы данных?


Ответы (1 шт):

Автор решения: Ainar-G

Насколько мне известно, таких возможностей нет. И вообще это нарушение правил нормализации данных. Как вариант, можно добавить генерируемую колонку и сделать её внешним ключом:

CREATE TABLE t1 (
  id INTEGER PRIMARY KEY
)
;

CREATE TABLE t2 (
  id    INTEGER PRIMARY KEY
, v     JSONB   NOT NULL
, t1_id INTEGER REFERENCES t1(id)
                GENERATED ALWAYS AS (CAST(v->'id' AS INTEGER)) STORED
)
;
→ Ссылка