Stel ik heb de models Product, ProductAttribute en ProductAttributeRelation
Een product kan product attributen hebben. (Zoals kleur, maat, gewicht...)
Een ProductAttribute kan aan meerdere producten worden gekoppeld. Het is eigenlijk de definitie van een product attribuut.
ProductAttributeRelation maakt de link tussen een Product en een ProductAttribute.
De ProductAttributeRelation heeft dan ook o.a. de volgende velden: product_id, attribute_id en value.
De value is dan de waarde die geldt voor het attribuut voor dat specifieke product.
Ik gebruik het repository design pattern voor alle data. Ik heb een Product repository en een ProductAttribute repository, maar géén ProductAttributeRelation repository.
Nu wil ik in de Product repository een functie implementeren om een product te verwijderen. Ik vraag me af of ik in die repository dan ook de verwijdering van de ProductAttributeRelation's moet implementeren, of dat dat daar niet hoort. Namelijk, als een product wordt verwijderd, moeten natuurlijk ook de relaties tussen dat product en attributen worden verwijderd, want deze ProductAttributeRelation's stellen dan niets meer voor en zouden dan voor altijd zwerven. Dus: dát die relaties moeten worden verwijdered is zeker, maar zou ik dat dan in die product repository moeten doen, of zou ik toch een aparte repository moeten maken voor ProductAttributeRelation?
De ProductAttributeRelation models zijn eigenlijk meer iets voor achter de schermen van de datalayer, ze representeren voornamelijk de database structuur en niet zo zeer de business models/classes structuur.
Zoals een product in de business logic code voorkomt, heeft deze class gewoon een array met zijn ProductAttribute instances die op hun beurt de juiste waarde hebben die voor het product geldt. De class ProductAttributeRelation wordt eigenlijk dus niet gebruikt in de business logic.
Dus mijn vraag: moet in de product repository ook gewoon zorg worden gedragen om de relaties netjes te verwijderen, of zou er toch een aparte repository moeten komen? Dus dat de business layer de taak heeft om de product repository aan te roepen "verwijder dit product" en daarna de ProductAttributeRelation repository aan te roepen "verwijder attribuut relaties die bij product X horen".
7.866 views