Neem de volgende situatieschets. Ik heb een entiteit persoon. Daarvan is bekend dat hij of zij relatie heeft inclusief een aantal gegevens over de partner en de specifieke type relatie (getrouwd of geregistreerd partnerschap). De partner is ofwel (nog) niet bekend, ofwel al wel bekend.
Dus stel we hebben de volgende situatie. Persoon A is getrouwd met persoon B. Ik sla persoon A op én persoon B. Van persoon B is nog goed als niks bekend. Op een gegevens moment is persoon B wel bekend met daarbij de gegevens dat persoon B getrouwd is met persoon A (zoals we al vanuit persoon A wisten). Persoon B was al ingevoerd dus we hoeven dan alleen zijn gegevens verder aan te vullen.
Ik loop nu te dubben over hoe ik dit goed moet opslaan. Dat kan naar mijn idee op twee manieren waarbij elke manier zijn voors en tegens heeft.
Optie 1
De FK zit vanzelfsprekend op relatie.partner_id > persoon.id en op relatie.persoon_id > persoon.id. Het voordeel van deze constructie is dat ik geen complexe koppeltabel nodig heb en dat bij het verwijderen van een van de twee personen de relatie ook automatisch verdwijnt. Het nadeel is echter dat ik de relatie tussen personen twee keer opsla. Zou ik de relatie één keer opslaan, dan heb ik aanvullende logica in mijn select nodig om te zien of een persoon opgeslagen staat als partner of persoon.Ook heb ik aanvullende logica nodig bij het invoeren om te zien of een persoon misschien al opgeslagen is als partner.
Optie 2
De FK zit nu op persoon_relatie.relatie_id > relatie.id, persoon_relatie.persoon_id > persoon.id en op persoon_relatie.partner_id > persoon.id. Het voordeel van deze structuur is dat ik maar een record heb in de relatie tabel voor deze specifieke relatie*. Het ophalen van beide personen inclusief de relatie kan met iets simpelere select. Het enige probleem is dat het consistent houden van deze relatie aanvullende logica vergt. Zo zou er een trigger moeten draaien om bij het invoeren van de waardes (1, 1, 2) ook de invoer doet (1, 2, 1) zodat beide personen ook een keer partner zijn. Daarnaast heb ik triggers nodig om bij het verwijderen van een persoon tevens het relatie record te verwijderen.
Wat is in dit geval nou het meest ideale model voor het opslaan van zo'n gelijkwaardige kruisrelatie?
*In dit voorbeeld zouden sowieso meerdere records vrij nutteloos zijn echter sla ik meer zaken op de relatie zoals de datum waarop iemand getrouwd is
Dus stel we hebben de volgende situatie. Persoon A is getrouwd met persoon B. Ik sla persoon A op én persoon B. Van persoon B is nog goed als niks bekend. Op een gegevens moment is persoon B wel bekend met daarbij de gegevens dat persoon B getrouwd is met persoon A (zoals we al vanuit persoon A wisten). Persoon B was al ingevoerd dus we hoeven dan alleen zijn gegevens verder aan te vullen.
Ik loop nu te dubben over hoe ik dit goed moet opslaan. Dat kan naar mijn idee op twee manieren waarbij elke manier zijn voors en tegens heeft.
Optie 1
code:
1
2
3
4
| persoon relatie | id | naam | | id | persoon_id | soort | partner_id | | 1 | A | | 1 | 1 | Getrouwd | 2 | | 2 | B | | 2 | 2 | Getrouwd | 1 | |
De FK zit vanzelfsprekend op relatie.partner_id > persoon.id en op relatie.persoon_id > persoon.id. Het voordeel van deze constructie is dat ik geen complexe koppeltabel nodig heb en dat bij het verwijderen van een van de twee personen de relatie ook automatisch verdwijnt. Het nadeel is echter dat ik de relatie tussen personen twee keer opsla. Zou ik de relatie één keer opslaan, dan heb ik aanvullende logica in mijn select nodig om te zien of een persoon opgeslagen staat als partner of persoon.Ook heb ik aanvullende logica nodig bij het invoeren om te zien of een persoon misschien al opgeslagen is als partner.
Optie 2
code:
1
2
3
4
| persoon relatie persoon_relatie | id | naam | | id | soort | | relatie_id | persoon_id | partner_id | | 1 | A | | 1 | Getrouwd | | 1 | 1 | 2 | | 2 | B | | 1 | 2 | 1 | |
De FK zit nu op persoon_relatie.relatie_id > relatie.id, persoon_relatie.persoon_id > persoon.id en op persoon_relatie.partner_id > persoon.id. Het voordeel van deze structuur is dat ik maar een record heb in de relatie tabel voor deze specifieke relatie*. Het ophalen van beide personen inclusief de relatie kan met iets simpelere select. Het enige probleem is dat het consistent houden van deze relatie aanvullende logica vergt. Zo zou er een trigger moeten draaien om bij het invoeren van de waardes (1, 1, 2) ook de invoer doet (1, 2, 1) zodat beide personen ook een keer partner zijn. Daarnaast heb ik triggers nodig om bij het verwijderen van een persoon tevens het relatie record te verwijderen.
Wat is in dit geval nou het meest ideale model voor het opslaan van zo'n gelijkwaardige kruisrelatie?
*In dit voorbeeld zouden sowieso meerdere records vrij nutteloos zijn echter sla ik meer zaken op de relatie zoals de datum waarop iemand getrouwd is
Sinds de 2 dagen regel reageer ik hier niet meer