Hallo php mensen,
Ik heb een vraagje m.b.t. veel op veel relaties in een database.
Ik ben op dit moment bezig om in symfony een database model te genereren. Ik zie dat er bij meer op meer relaties de volgende opties zijn:
- Many to many unidirectional
- Many to many Bidirectional
- Many to many, Self-referencing
Het probleem is dat ik niet goed de verschillen hiertussen begrijp. Op de pagin zelf wordt het niet beschreven en ik heb al een tijdje op google zitten zoeken maar kan niet echt een duidelijke uitleg hiervan vinden. Kan iemand mij misschien makkelijk het verschil tussen deze 3 beschrijven zodat ik weet wat ik eventueel zou moeten gebruiken?
unidirectional > 1 richtingsverkeer. Dus van tabel A wordt er alleen uit tabel B gepakt. B pakt niet uit A
bidirectional > 2 richtingsverkeer. Dus tabel A pakt uit B, en B uit A.
selfreferencing > zelf-refererend. Dus tabel A vul je met gegevens uit tabel A. Vaak via een INNER-join.
--> Dus tabel A vul je met gegevens uit tabel A. Vaak via een INNER-join.
refereren kan altijd wel maar A vul je met gegevens uit tabel A mogelijk niet. Dit resulteert mogelijk in een foutmelding die "mutating table error" heet dus dat gaat niet of slechts beperkt goed.
Ik denk dat, zelfs als je definities van deze types hebt, je toch een zeker gevoel moet ontwikkelen welke opzet je hanteert. Of je zou het gedrag als leidraad kunnen gebruiken.
Vorige keer hadden we geloof ik boeken en auteurs als voorbeeld genomen:
Unidirectional:
<?php
class Book {
private $authors;
function __construct() {
$this->authors = new ArrayCollection();
}
}
class Author {
// ...
}
?>
Bidirectional:
<?php
class Book {
private $authors;
function __construct() {
$this->authors = new ArrayCollection();
}
}
class Author {
private $books;
function __construct() {
$this->books = new ArrayCollection();
}
}
?>
Als je nu kijkt naar de Unidirectional dan zie je dat als je een entity Book hebt dat je dus tevens de bijbehorende auteurs hebt. Je kunt dus van Book naar Auteur. Maar heb je nu een entity Author dan weet je dus mooi niet welke boeken deze heeft geschreven. Je kunt dus niet van Auteur naar Boek.
Bij Bidirectional kun je heel simpel kiezen: Of je pakt een entity Book of je pakt een entity Author en dan kun je van beiden naar de ander.
De laatste is dus in principe handiger. Echter kan het in sommige situaties ook onnodig zijn. Bijvoorbeeld als je Nooit van een Entity Author hoeft te weten welke boeken daarbij zitten.