Claves foráneas en relaciones de muchos a muchos.
Estamos construyendo un blog para una introducción. a las bases de datos del proyecto del curso.
En nuestro blog, queremos poder configurarLabels
enPosts
. losLabels
no pueden existir por sí mismos, solo lo hacen si están relacionados con unPosts
. De esta manera,Labels
que no son utilizados por ningunaPosts
No debe permanecer en la base de datos.
Más de unoLabel
puede pertenecer a una solaPost
, y mas de una solaPost
puede usar unLabel
.
Estamos utilizando tanto SQLite3 (localmente / pruebas) como PostgreSQL (implementación).
ImplementaciónAquí está el SQL (sabor de SQLite3) que usamos para crear esas dos tablas, junto con la tabla de relaciones:
MensajesCREATE TABLE IF NOT EXISTS Posts(
id INTEGER PRIMARY KEY AUTOINCREMENT,
authorId INTEGER,
title VARCHAR(255),
content TEXT,
imageURL VARCHAR(255),
date DATETIME,
FOREIGN KEY (authorId) REFERENCES Authors(id) ON DELETE SET NULL
)
EtiquetasCREATE TABLE IF NOT EXISTS Labels(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) UNIQUE,
-- This is not working:
FOREIGN KEY (id) REFERENCES LabelPosts(labelId) ON DELETE CASCADE
)
LabelPosts (relación entrePost
[1 .. *] - *Label
)
CREATE TABLE IF NOT EXISTS LabelPosts(
postId INTEGER,
labelId INTEGER,
PRIMARY KEY (postId, labelId),
FOREIGN KEY (postId) REFERENCES Posts(id) ON DELETE CASCADE
)
ProblemaUtilizando SQLite3,Labels
no se eliminan de la base de datos cuando elimino todas las referencias a ella de laLabelPosts
mesa. Creo que por la razón dada por Postgres, a pesar de que SQLite acepta la tabla sin previo aviso.
PostgreSQL se queja de quelabelId
no es único dentroLabelPosts
, lo cual es cierto y también es necesario, ya que es de muchos a muchos:
pq: S: "ERROR" R: "transformFkeyCheckAttrs" L: "6511" C: "42830" F: "tablecmds.c"
M: "no hay una restricción única que coincida con las claves dadas para la tabla a la que se hace referencia \" labelposts \ ""
Así que entiendo que estoy haciendo mi restricción mal. Sin embargo no sé cómo hacerlo correctamente.