SQL Server – Chemin d'access en cascade cyclique

Disons que j'ai deux tables – User et Post

J'ai présenté une table de jointure personnalisée Vote pour avoir une relation plusieurs-à-plusieurs entre l' user et la publication .

Les tables ont la structure suivante:

  • Utilisateur ( UseId , Name)
  • Post ( PostId , UserId, Contenu)
  • Vote ( Id , UserId, PostId, Valeur)

Remarques:

  • Les colonnes soulignées de chaque table est un PK .
  • L' UserId dans la publication est une table FK vers user .
  • Les colonnes UserId et PostId dans la table Vote sont FK pour les tables respectives.
  • Les autres colonnes comme Value , Content , Name , etc. sont varchar.

Considérant que la design ci-dessus est appropriée (sinon, les suggestions sont les bienvenues 🙂 …..

Ce que je veux c'est:

  1. Si une ligne dans Post Table est supprimée, la ligne associée dans Vote doit également être supprimée.
  2. Si une ligne dans User Table est supprimée, la ligne correspondante dans Vote doit également être supprimée.
  3. Si une ligne de la table user est supprimée, la colonne UserId la ligne associée dans Post doit être définie sur NULL.

Est-ce que je peux réaliser de telles relations, sans aucune Cyclic-Redundancy ? Si oui, comment?


METTRE À JOUR:

Découvrez cette réponse géniale si vous avez également fait face à plusieurs paths en cascade:

Vous searchz des relations de key étrangère en cascade. Pour les deux premiers:

 alter table vote add constraint fk_vote_user foreign key (userid) references user(userid) on delete cascade; alter table vote add constraint fk_vote_post foreign key (postid) references post(postid) on delete cascade; 

Pour le troisième:

 alter table post add constraint fk_post_user foreign key (userid) references user(userid) on delete set null; 

Ceux-ci sont expliqués dans la documentation .

Une façon consiste à append un isdeleted bit, changed datetime colonnes isdeleted bit, changed datetime dans chaque table et à utiliser des triggersurs pour mettre à jour les valeurs de colonne lors de la suppression. Dans ce cas, vous conserverez l'historique de vos votes, messages et users.

Ou juste sur les triggersurs de suppression.

Ou pour utiliser la relation en cascade comme Gordon Linoff posté.