web-dev-qa-db-fra.com

Tableau PostgreSQL d'éléments contenant chacun une clé étrangère

J'essaie de créer une base de données pour mon application et j'aimerais trouver le meilleur moyen de créer une relation un-à-plusieurs entre mes tables Users et Items.

Je sais que je peux créer une troisième table, ReviewedItems, et que les colonnes soient un id User et un id Item, mais j'aimerais savoir s'il est possible de créer une colonne dans Users, disons reviewedItems, qui est un tableau entier contenant des clés étrangères pour Items que le User a révisé.

Si PostgreSQL peut le faire, faites le moi savoir! Sinon, je vais simplement suivre ma troisième voie.

45
Zach

Non, ce n'est pas possible.

PostgreSQL est un SGBD relationnel, fonctionnant plus efficacement sur des modèles de données correctement normalisés. Les tableaux sont - par définition, des ensembles ordonnés - et non des structures de données relationnelles. Par conséquent, le standard SQL ne prend pas en charge la définition de clés étrangères sur des éléments de tableau, pas plus que PostgreSQL.

Toutefois, vous pouvez créer une base de données parfaite avec des éléments de tableau liés aux clés primaires dans d’autres tables. Cependant, ces éléments de tableau ne peuvent pas être déclarés clés étrangères et le SGBD ne conservera donc pas l'intégrité référentielle.

41
Patrick

Cela sera peut-être bientôt possible: https://commitfest.postgresql.org/17/1252/ - Mark Rofail a fait un excellent travail sur ce patch!

Le correctif permettra (une fois terminé) de

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

Cependant, l'auteur a actuellement besoin d'aide pour modifier le correctif (au-delà de mes propres capacités). Tous ceux qui liront ce message et qui connaissent les composants internes de Postgres peuvent donc aider si vous le pouvez.

40
Jarym