PostgreSQL массив элементов, каждый из которых является внешним ключом

Я пытаюсь создать базу данных для своего приложения, и я хотел бы найти лучший способ сделать это - создать отношения один-ко-многим между моими приложениями. Users а также Items столы.

Я знаю, что могу сделать третий стол, ReviewedItemsи столбцы должны быть User идентификатор и Item идентификатор, но я хотел бы знать, возможно ли сделать столбец в Usersскажем reviewedItems, который является целочисленным массивом, содержащим внешние ключи к Items что User рассмотрел.

Если PostgreSQL может сделать это, пожалуйста, дайте мне знать! Если нет, я просто пойду по третьему столу.

2 ответа

Решение

Нет, это невозможно.

PostgreSQL - это реляционная СУБД, наиболее эффективно работающая на должным образом нормализованных моделях данных. Массивы - по определению, они являются упорядоченными наборами - не являются реляционными структурами данных, и поэтому стандарт SQL не поддерживает определение внешних ключей для элементов массива, как и PostgreSQL.

Однако вы можете создать превосходную базу данных с элементами массива, связанными с первичными ключами в других таблицах. Однако эти элементы массива не могут быть объявлены как внешние ключи, и поэтому СУБД не будет поддерживать ссылочную целостность.

Возможно, скоро это удастся сделать: https://commitfest.postgresql.org/17/1252/ - Марк Рофэйл проделал отличную работу над этим патчем!

Патч (после завершения) позволит

CREATE TABLE PKTABLEFORARRAY (
    ptest1 float8 PRIMARY KEY,
    ptest2 text
);
CREATE TABLE FKTABLEFORARRAY (
    ftest1 int[],
    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY,
    ftest2 int
);

Тем не менее, автору в настоящее время нужна помощь, чтобы обновить патч (помимо моих собственных способностей), поэтому любой, кто читает это, кто знает внутренности Postgres, пожалуйста, помогите, если можете.

Другие вопросы по тегам