Relatie
Ik heb een database met daarin 3 tabellen
Tabel gebruikers:
ID (int 11)
Tabel forum_berichten
gebruiker_id (int 11)
Tabel ban
gebruiker_id (int 11)
Nu wil ik graag dat als een gebruiker word verwijderd uit de tabel gebruikers deze automatisch ook word verwijderd in de tabel forum_berichten en ban.
Nu moet ik dus foreign keys gebruiken alleen ik krijg het voor elkaar om een relatie te leggen tussen 2 tabellen (dus een 1 op 1 relatie) maar ik krijg het niet voor elkaar om een 1 op meer relatie te leggen
Dit is wat ik gebruikte om de 1 op 1 relatie te maken
ALTER gebruikers ADD FOREIGN KEY(ID) REFERENCES forum_berichten(gebruiker_id) ON DELETE CASCADE
Hoe krijg ik het nu voor elkaar dat als ik de gebruiker verwijder uit de gebruiker tabel hij alle child records ook verwijderd (dus in forum_berichten en ban) ?
Whooo, stop!
Even controleren of ik het goed snap, als jij een gebruiker banned/ of verwijderd, dat alle posts weg zijn? En wat nou als die gebruiker nuttige posts heeft gedaan in het verleden en de boel nu loopt te verzieken?
Je wilt natuurlijk alleen zijn "verziekposts" en "verziektopics" wissen, niet al zijn reacties. Daar kan (ligt misschien ook aan het forumgebruik) iemand anders nog weer wat aan hebben. Posts zou ik dan ook niet zomaar verwijderen met de gebruiker, en ik zou de gebruiker ook niet verwijderen. Misschien op non-actief zetten, dat het "lijkt alsof die gewist is" maar je hebt dan de gegevens nog wel in elk geval.
Misschien kan je even toelichten waarom je dit eigenlijk zo wil, volgens mij moet er een slimmere oplossing zijn.
Wat ik simpel wil is dat wanneer je een gebruiker verwijderd dat ook alle referenties worden verwijderd of op null word gezet.
Ik sta ook niet toe door wie dan ook om een gebruiker te verwijderen. Maar bij andere dingen is het wel handig.
Hier een voorbeeld die ik wel wil implementeren:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Tabel forum_topics
- ID (int)
Tabel forum_berichten:
- forum_berichten_id (int)
- forum_topic_id (int)
Tabel forum_gelezen
- forum_topic_id
- ID (int)
Tabel forum_berichten:
- forum_berichten_id (int)
- forum_topic_id (int)
Tabel forum_gelezen
- forum_topic_id
Hier zie je dat forum_topic_id uit forum_berichten en forum_topic_id uit forum_gelezen gelinkt zijn aan ID uit forum_topics. Op moment dat ik een topic verwijder moeten alle referenties dus ook verwijderd worden.
Dus in dit geval heb ik een 1 op meer relatie vanaf forum_topics(ID)
Hoe krijg ik dat voor elkaar?
Volgens mij,ik doe dit uit mijn hoofd, zo geen webserver (ook niet lokaal) beschikbaar om te testen, (computer waarop ik normaal werk niet hier, dus ook wachtwoorden niet) moet je dus het volgende doen:
ALTER forum_berichten ADD FOREIGN KEY(forum_topic_id) REFERENCES forum_topics(ID) ON DELETE CASCADE
Misschien net andersom hoor, dan moet het zo:
ALTER forum_topics ADD FOREIGN KEY(ID) REFERENCES forum_berichten(forum_topic_id) ON DELETE CASCADE
Eenzelfde soort relatie maak je aan tussen "Tabel forum_gelezen" en tabel topics. Moet opzich geen problemen opleveren.
Dan nog even een kanttekening: Ook hier geld dat verwijderen niet een ideale oplossing is. Je kan net zo goed een topic op non-actief zetten, vanuit deze instelling het topic niet meer weergeven in de topiclijst. Maar heb ik hem in de favorieten staan, kan ik het topic in elk geval nog weer terugzoeken.
Daarbij als je ook nog op wilt slaan hoeveel posts, welke posts, post-historie enzovoorts, dan mag je al helemaal geen gegevens weggooien (is geen aanrader).
Als je de juiste indexes aanmaakt en dus topic op actief/ inactief zet, is het één en ander heel eenvoudig te realiseren. + je raakt zo nooit wat kwijt en kan altijd de boel weer terugzoeken.
Leg anders even aan de hand van een voorbeeld uit, wat de situatie nu is,
en hoe die zou moeten worden.
Onder zijn tabellen opzet staat wel uitgelegd dat hij met die tabellen wanneer een topic wordt gewist, ook alle referenties aan/ naar dat topic wil verwijderen met ON DELETE CASCADE.
Hartelijk bedankt voor je reactie Robert. Ik heb het probleem inmiddels opgelost mede dankzij jouw hulp.
Ik ben nog steeds wel benieuwd naar de precieze situatie eigenlijk, in de meeste gevallen is het praktischer om gegevens op "inactief" te zetten dan om ze echt te wissen.
Dit zou niet vaak voorkomen maar mocht het toch nog een keer voorkomen dat wil ik dat het ook geen sporen achterlaat.