Updaten van samengestelde datastructuur

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Mark Hogeveen

Mark Hogeveen

15/08/2021 20:53:44
Quote Anchor link
Stel ik heb een API waarbij een samengestelde parent-child datastructuur kan worden gemaakt, gelezen, geüpdate en verwijderd.
In dit fictieve voorbeeld gebruik ik JSON als request en response format.

Hier heeft een company meerdere departments.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "id": 12,
    "name": "Voorbeeld B.V.",
    "address": "....",
    "departments": [
        {
            "id": 24,
            "company_id": 12,
            "employees": 10,
        },
        {
            "id": 38,
            "company_id": 12,
            "employees": 14,
        }
    ]
}


Bij het maken/updaten van een company, wordt de data in bovenstaande JSON indeling verzonden naar de server.

De database tabellen:

companies: id, name, address
departments: id, company_id, employees

company_id in departments tabel, verwijst naar id in company tabel.

Nou wil de gebruiker een company updaten. Hij wil een department ervan verwijderen.
Door een eis aan de applicatie, moet bij het aanpassen van de gegevens steeds de hele lap JSON worden verzonden naar de server.
Dus wanneer aan de clientside een department is verwijderd (via bijvoorbeeld een HTML form), zal de volgende JSON data
worden verzonden naar de server:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
{
    "id": 12,
    "name": "Voorbeeld B.V.",
    "address": "....",
    "departments": [
        {
            "id": 24,
            "company_id": 12,
            "employees": 10,
        }
    ]
}


De server ontvangt deze JSON, maar nu wordt het wat complex.
Je kunt de JSON namelijk telkens beschouwen als een volledige versie/toestand van de volledige data.
Met andere woorden: het is altijd de volledige informatie.
In plaats van naar de server te verzenden: "verwijder department met id 38, van de company met id 12", wordt gewoon een nieuwe versie van de hele lap data verzonden.
Het nadeel is dat de server nu moet gaan uitzoeken wát eventueel is verwijderd en wát eventueel is toegevoegd.
De server moet dus de huidige versie vergelijken met de nieuwe versie die nu is binnengekomen. Dus: een department rij die in de huidige (nu oude) versie op de server wél nog voorkomt, en in de nieuwe versie in de request niet meer voorkomt, wordt beschouwd als verwijderd door de gebruiker.
Een rij die in de originele versie op de server niet voorkwam, maar in de nieuwe versie in de request wél voorkomt, wordt beschouwd als toegevoegd.
Je zou het misschien niet zeggen, maar hier komt veel logica en dus complexere code bij kijken.
Het wordt erger als de datastructuur nog een laag erbij krijgt, en dat bijvoorbeeld elke department nog child rijen erbij krijgt.
Bijvoorbeeld dat aan elke department nog zogenaamde employee rijen kunnen worden gekoppeld.

Als ik al die server logica wil voorkomen, kan ik ook alle geassocieerde rijen van die specifieke company steeds verwijderen,
en dan aan de hand van de nieuwe (JSON) versie van de data alle betreffende rijen weer opnieuw creëeren. Verwijderde rijen blijven dan vanzelf weg (want deze zijn net verwijderd, en komen niet meer voor in de nieuwe JSON versie, dus worden ook niet her-creëerd).
Maar er is één probleem: alles verwijderen en weer opnieuw maken, zorgt ervoor dat elke rij een nieuwe (auto_increment, primary key) id krijgt. En dat is onwenselijk.

Wat is de beste manier om dit op te lossen? Dus hoe ga jij om met samengestelde hiërarchische data structuren?
Gewijzigd op 15/08/2021 20:59:20 door Mark Hogeveen
 
PHP hulp

PHP hulp

23/04/2024 09:34:16
 
Rob Doemaarwat

Rob Doemaarwat

15/08/2021 21:42:16
Quote Anchor link
pseudo code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$department_ids = [];

foreach(json[departments] as $department){
  if($department.id bestaat in database){
    SQL: update departments set ... where id = {$department.id}
    $department_ids[] = $department.id
  }
  else{
    SQL: insert into departments values (...)
    $department_ids[] = last_insert_id
  }
}

//opruimen verwijderde (niet voorkomende) departments

SQL: delete from departments
     where company_id = {json.id}
       and id not in ({$department_ids})
Gewijzigd op 15/08/2021 21:43:13 door Rob Doemaarwat
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.