2016-12-09 1 views
6

Ich versuche, eine DB für meine App zu erstellen, und eine Sache, die ich möchte die beste Möglichkeit zu tun ist erstellen eine Eins-zu-viele-Beziehung zwischen meinem Users und Items Tabellen.PostgreSQL-Array von Elementen, die jeweils ein Fremdschlüssel sind

Ich weiß, dass ich einen dritten Tisch machen, ReviewedItems, und haben die Spalten sein ein User id und ein Item id, aber ich würde gerne wissen, ob es möglich ist, eine Spalte in Users zu machen, lassen Sie uns reviewedItems sagen, was ist ein Integer-Array, das Fremdschlüssel zu Items enthält, die der User überprüft hat.

Wenn PostgreSQL dies tun kann, lass es mich wissen! Wenn nicht, gehe ich einfach meine dritte Tischroute hinunter.

+0

Das ist ein schlechtes Design, lesen Sie über relationale Modellierung. Es ist auch eine Frage, bitte google deinen Titel. – philipxy

+1

Es gibt Patches, mit denen Postgres diese Funktion hinzugefügt werden kann, siehe https://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/ (2012) und https: //www.postgresql .org/Nachrichten-ID/CAJvoCuuEgQ% 2Bpjv02rjvQN4o9s4_H3HJMdZdQwss2b0c0-xagEw% 40mail.gmail.com (2017). Sie wurden noch nicht akzeptiert, aber hoffentlich eines Tages. –

Antwort

7

Nein, das ist nicht möglich.

PostgreSQL ist ein relationales DBMS, das am effizientesten auf 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 auf Array-Elementen und auch nicht PostgreSQL.

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 wird daher die referenzielle Integrität nicht beibehalten.

+1

Sie können einen Constraint-Trigger definieren, der dies überprüft. Aber ich bin mir nicht sicher, ob es in allen Fällen zuverlässig funktioniert. –

+0

@a_horse_with_no_name: Könnten Sie ein Beispiel über "zuverlässig in allen Fällen" geben? Sie meinen, manchmal kann der Auslöser fehlschlagen? Vielen Dank. –

+1

@LuanHuynh: Ich erinnere mich nicht an die (technischen) Details, aber das letzte Mal, dass dies auf der Mailingliste diskutiert wurde, erwähnte jemand, dass ein entsprechender Constraint-Trigger nicht alle Fälle erfassen könnte - aber das ist vielleicht nicht mehr wahr –

Verwandte Themen