Estoy intentando crear una base de datos para mi aplicación y una cosa que me gustaría encontrar la mejor manera de hacerlo es crear una relación de uno a muchos entre mis tablas Users
y Items
.
Sé que puedo hacer una tercera tabla, ReviewedItems
y que las columnas sean una User
identificación y una Item
identificación, pero me gustaría saber si es posible hacer una columna Users
, digamos reviewedItems
, que es una matriz de enteros que contiene claves externas para Items
eso el User
ha revisado.
Si PostgreSQL puede hacer esto, ¡hágamelo saber! Si no es así, seguiré la ruta de mi tercera tabla.
Respuestas:
No, esto no es posible.
PostgreSQL es un DBMS relacional , que opera de manera más eficiente en modelos de datos correctamente normalizados. Las matrices son, por definición, conjuntos ordenados, no estructuras de datos relacionales y, por lo tanto, el estándar SQL no admite la definición de claves externas en elementos de matriz, y tampoco PostgreSQL.
Sin embargo, puede construir una base de datos perfectamente fina con elementos de matriz vinculados a claves primarias en otras tablas. Sin embargo, esos elementos de la matriz no se pueden declarar como claves externas y, por lo tanto, el DBMS no mantendrá la integridad referencial.
fuente
reliably in all cases
? ¿Quiere decir que a veces el disparador puede fallar? Gracias.Es posible que pronto sea posible hacer esto: https://commitfest.postgresql.org/17/1252/ - ¡Mark Rofail ha estado haciendo un excelente trabajo en este parche!
El parche (una vez completado) permitirá
CREATE TABLE PKTABLEFORARRAY ( ptest1 float8 PRIMARY KEY, ptest2 text ); CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int );
Sin embargo, el autor actualmente necesita ayuda para reajustar el parche (más allá de mi capacidad), así que cualquiera que lea esto y conozca los aspectos internos de Postgres, por favor ayude si puede.
fuente
CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )