Ich versuche, eine Datenbank für meine App zu erstellen, und ich möchte den besten Weg finden, eine Eins-zu-Viele-Beziehung zwischen meiner Users
und meinen Items
Tabellen herzustellen.
Ich weiß , ich kann einen dritten Tisch machen, ReviewedItems
und haben die Säulen sein , User
ID und eine Item
ID, aber ich würde gerne wissen , ob es möglich ist , in eine Spalte zu machen Users
, lassen Sie uns sagen reviewedItems
, das ist eine ganze Zahl Array mit Fremdschlüssel zu , Items
dass das User
hat überprüft.
Wenn PostgreSQL dies kann, lassen Sie es mich bitte wissen! Wenn nicht, gehe ich einfach meine dritte Tischroute entlang.
Antworten:
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 einwandfreie 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 keine referenzielle Integrität bei.
quelle
reliably in all cases
? Du meinst manchmal kann der Trigger fehlschlagen? Vielen Dank.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) zulassen
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 starten (über meine eigenen Fähigkeiten hinaus). Wenn Sie dies lesen und Postgres-Interna kennen, helfen Sie bitte, wenn Sie können.
quelle
CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )