Я пытаюсь создать БД для своего приложения, и я бы хотел найти лучший способ сделать это - создать связь «один ко многим» между моими Users
и Items
таблицами.
Я знаю, что могу создать третью таблицу, ReviewedItems
и столбцы должны быть User
идентификаторами и Item
идентификаторами, но я хотел бы знать, возможно ли создать столбец Users
, скажем reviewedItems
, в целочисленном массиве, содержащем внешние ключи для Items
этого User
рассмотрел.
Если PostgreSQL может это сделать, сообщите мне! Если нет, я просто выберу свой третий маршрут за столом.
Ответы:
Нет, это невозможно.
PostgreSQL - это реляционный СУБД, наиболее эффективно работающая с правильно нормализованными моделями данных. Массивы по определению являются упорядоченными наборами, а не реляционными структурами данных, и поэтому стандарт SQL не поддерживает определение внешних ключей для элементов массива, как и PostgreSQL.
Однако вы можете создать отличную базу данных с элементами массива, связанными с первичными ключами в других таблицах. Однако эти элементы массива не могут быть объявлены внешними ключами, и поэтому СУБД не будет поддерживать ссылочную целостность.
источник
reliably in all cases
? Вы имеете в виду, что иногда триггер может не сработать? Благодарю.Возможно, скоро это станет возможным: 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, пожалуйста, помогите, если сможете.
источник
CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )