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, пожалуйста, помогите, если можете.