ik heb met PMA 2.9.2 deze interne relaties opgesteld. alle tabellen zijn met engine MyISAM
ik heb nu bv. :
3 id's in News_item
4 id's in News_category
en in News_itemcat (koppeltabel):
item cat
1 2
1 3
2 4
2 3
Nu mijn probleem: als ik een categorie wis in News_category (vb 2) dan blijft de relatie in de koppeltabel gewoon bestaan en krijg je corrupte data.
Hoe kan ik dit het best oplossen?
Engine MyISAM wil ik veranderen als het nodig is ;-)
(Als het echt niet kan, dan moet ik overal ingewikkelde query's gaan toepasssen maar ik hou het liever zo simpel mogelijk)
Wat je óók nog kunt overwegen is om hem NULL te maken als de user verwijderd word (ON DELETE SET NULL), met een left join kun je dan toch alle reacties ophalen, je mist dan alleen een gebruikersnaam...
dus de categorieën selecteren bij een nieuwsbericht toevoeging is geen probleem, ook niet bij het editten trouwens.
Maar als iemand nu een categorie wil verwijderen van een newsitem, hoe doe ik dat dan het best? ik krijg alle geselecteerde checkboxen binnen via een array
Maar als iemand nu een categorie wil verwijderen van een newsitem, hoe doe ik dat dan het best?
Niet verwijderen. Dat zou mijn keuze zijn.
Wanneer je de boel niet meer wilt weergeven, dan pas je gewoon de status van een categorie aan. Met verwijderen zul je ook alle gekoppelde gegevens moeten verwijderen of moeten accepteren dat je niets meer hebt aan deze gegevens. Het verband raak je tenslotte kwijt.
Vandaar mijn keuze om vrijwel nooit iets weg te gooien, maar gewoon de status aan te passen. Een paar miljoen records staan zelden in de weg, maak je daar dus niet al te druk over. Helaas heeft MySQL wat moeite met het toepassen van meerdere indexen, in MySQL zou je dus tegen performance-problemen aan kunnen lopen die zijn gerelateerd aan indexen.
Maar zorg eerst maar eens dat je dat probleem krijgt (paar miljoen records), dan weet je tenminste zeker dat je een succesvol systeem hebt gebouwd.
En als oplossing kun je natuurlijk altijd PostgreSQL gaan gebruiken...
Tussen de items en de categorie zal een koppeltabel zitten, er zijn tenslotte meerdere mogelijkheden. Ook in dat geval zou ik er voor kiezen om gewoon de status van de gegevens in de koppeltabel aan te passen en niet om het record weg te gooien. Wanneer je dan toevallig de laatste koppeling weggooid, raak je het verband tussen het item en de categorie kwijt. En wanneer de fk zo is ingesteld dat e.e.a. wordt verwijderd, ben je in elk geval het item kwijt.
Gewoon een kolom 'status' toevoegen aan de tabel News_itemcat en daar een bool inzetten, true of false. Klaar ben je.
dan heb je nog niet geantwoord hoe ik het dan het best doe,
ik krijg de geselecteerde cat's binnen op een array...
Hoe je de boel ontvangt, heeft niets te maken met de manier waarop je gegevens opslaat. Dat zijn echt 2 totaal verschillende dingen.
Wat jij ontvangt, zijn de waardes die zijn aangevinkt. Die sla je op of je zet de status op 'true'. De overige waardes in de database die betrekking hebben op dit item, zet je op status 'false'.