Contraintes de clés étrangères dans les relations plusieurs-à-plusieurs

Contexte

Nous construisons un blog pour une intro. les bases de données en cours de projet.

Dans notre blog, nous voulons être en mesure de définir Labels sur Posts. Le Labels ne peut exister par eux-mêmes, ils ne le faire que s'ils sont liés à un Posts. De cette façon, Labels qui ne sont pas utilisés par tout Posts ne faut pas rester dans la base de données.

Plus d'un Label peut appartenir à un seul Postet plus qu'un seul Post pouvez utiliser un Label.

Nous utilisons à la fois SQLite3 (local/test) et PostgreSQL (déploiement).

Mise en œuvre

Voici le SQL (SQLite3 saveur) que nous utilisons pour la création de ces deux tables, avec la table de relation:

Postes

CREATE 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
)

Étiquettes

CREATE 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 (relation entre Post [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
)

Problème

  • À l'aide de SQLite3, Labels ne sont pas supprimés de la base de données lorsque j'ai supprimer toutes les références à partir de la LabelPosts table. Je pense que pour la raison donnée par Postgres, malgré SQLite acceptant la table sans avertissement.
  • PostgreSQL se plaint que labelId n'est pas unique dans LabelPostsce qui est vrai et aussi nécessaire, car il est plusieurs-à-plusieurs:

pq: S:"ERREUR" R:"transformFkeyCheckAttrs" L:"6511" C:"42830" F:"tablecmds.c"
M:"il n'y a pas de contrainte unique correspondant donné les clés pour table référencée \"labelposts\""

Donc, je comprends que je suis en train de faire ma contrainte de mal. Cependant, je ne sais pas comment le faire correctement.

source d'informationauteur AntoineG