web-dev-qa-db-de.com

PostgreSQL-Array von Elementen, bei denen es sich jeweils um einen Fremdschlüssel handelt

Ich versuche, eine Datenbank für meine App zu erstellen, und ich würde gerne eine Eins-zu-Viele-Beziehung zwischen meinen Tabellen Users und Items herstellen.

Ich weiß, dass ich eine dritte Tabelle erstellen kann, ReviewedItems, und die Spalten müssen eine User -ID und eine Item -ID sein, aber ich möchte wissen, ob dies möglich ist Erstellen Sie eine Spalte in Users, sagen wir reviewedItems, ein ganzzahliges Array mit Fremdschlüsseln für Items, das von User überprüft wurde.

Wenn PostgreSQL dies kann, lassen Sie es mich bitte wissen! Wenn nicht, gehe ich einfach meine dritte Tischroute hinunter.

45
Zach

Nein das ist nicht möglich.

PostgreSQL ist ein relationales DBMS, das am effizientesten mit ordnungsgemäß normalisierten Datenmodellen arbeitet. Arrays sind per Definition geordnete Mengen, keine relationalen Datenstrukturen, und der SQL-Standard unterstützt daher nicht die Definition von Fremdschlüsseln für Array-Elemente und PostgreSQL auch nicht.

Sie können jedoch eine perfekte Datenbank mit Array-Elementen erstellen, die mit Primärschlüsseln in anderen Tabellen verknüpft sind. Diese Array-Elemente können jedoch nicht als Fremdschlüssel deklariert werden, und das DBMS behält daher die referenzielle Integrität nicht bei.

41
Patrick

Möglicherweise ist dies bald möglich: https://commitfest.postgresql.org/17/1252/ - Mark Rofail hat hervorragende Arbeit an diesem Patch geleistet!

Der Patch wird (sobald er abgeschlossen ist) erlauben

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

Derzeit benötigt der Autor jedoch Hilfe, um den Patch neu zu erstellen (über meine eigenen Fähigkeiten hinaus). Wenn Sie also die Postgres-Interna kennen, helfen Sie bitte, wenn Sie können.

40
Jarym