Zachování klíčů při update tabulek z JSON feedu s NDB

Desttro
Člen | 126
+
0
-

Ahoj, chtěl bych vás poprosit o radu, jak nejefektivněji udělat update řádků v databázi, kde jsou závislosti v podobě cizích klíčů.
Data se budou tahat z JSON feedu. Je třeba, aby klíče byly zachovány, protože na tabulky (obrázek níže) budou další závislosti – budou se k nim zapisovat další zánamy atd. Proto nemohu jednoduše smazat tabulky a udělat znovu insert.
Je třeba, aby se nějak kontrolovalo, zda záznam existuje, jestli ano, tak zda se shoduje, pokud je jiný, udělá se update, pokud neexistuje, vloží se nový řádek a přiřadí se klíčem k tabuce.
Napadlo mě to kontrolovat nějakým hashem a přemýšlím, jak nejlépe to s NDB udělat. Máte s tím někdo nějaké zkušenosti, prosím? Budu rád za jakoukoliv radu!

Struktura JSONu:

Struktura DB:

Zde je můj parser, který zatím umí jenom zpracovat JSON a vložit záznamy do DB, funkce na update je zatím prázdná:

<?php
declare(strict_types=1);

namespace App\Model;

use Nette;
use Nette\Utils\Json;

final class FeedManager
{
    use Nette\SmartObject;

    const
        CUSTOMER_TABLE_NAME = 'customer',
        CUSTOMER_COLUMN_NAME = 'name',
        CUSTOMER_COLUMN_PREFIX = 'prefix',

        SYSTEM_TABLE_NAME = 'system',
        SYSTEM_COLUMN_CUSTOMER_ID = 'customer_id',
        SYSTEM_COLUMN_SID = 'sid',
        SYSTEM_COLUMN_ROLE = 'role',

        INSTANCE_TABLE_NAME = 'instance',
        INSTANCE_COLUMN_SYSTEM_ID = 'system_id',
        INSTANCE_COLUMN_HOSTNAME = 'hostname',
        INSTANCE_COLUMN_DOMAIN = 'domain',

        COLUMN_ID = 'id';

    /**
     * @var Nette\Database\Context
     */
    private $database;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
    }

    public function downloadData() : void
    {
    }

    public function importData() : Nette\Database\Context
    {
        $json = file_get_contents('json.json');
        $query = $this->database;

        try
        {
            $data = Json::decode($json);

            $customerRecords = array();
            $systemRecords = array();
            $instanceRecords = array();

            $customerId = 0;
            $systemId = 0;

            foreach ($data->customer as $customerData)
            {
                if(!empty($customerData))
                {
                    $customerRecords[] = [
                        self::CUSTOMER_COLUMN_NAME => $customerData->name,
                        self::CUSTOMER_COLUMN_PREFIX => $customerData->prefix
                    ];
                    $customerId++;
                }

                foreach ($customerData->system as $systemData)
                {
                    if(!empty($systemData))
                    {
                        $systemRecords[] = [
                            self::SYSTEM_COLUMN_CUSTOMER_ID => $customerId,
                            self::SYSTEM_COLUMN_SID => $systemData->sid,
                            self::SYSTEM_COLUMN_ROLE => $systemData->role
                        ];
                        $systemId++;
                    }

                    foreach ($systemData->instance as $instanceData)
                    {
                        if(!empty($instanceData))
                        {
                            $instanceRecords[] = [
                                self::INSTANCE_COLUMN_SYSTEM_ID => $systemId,
                                self::INSTANCE_COLUMN_HOSTNAME => $instanceData->hostname,
                                self::INSTANCE_COLUMN_DOMAIN => $instanceData->domain
                            ];
                        }
                    }
                }
            }

            $query->query('SET FOREIGN_KEY_CHECKS = 0');
            $query->table(self::CUSTOMER_TABLE_NAME)->insert($customerRecords);
            $query->table(self::SYSTEM_TABLE_NAME)->insert($systemRecords);
            $query->table(self::INSTANCE_TABLE_NAME)->insert($instanceRecords);
            $query->query('SET FOREIGN_KEY_CHECKS = 1');

        } catch (Nette\Utils\JsonException $e)
        {
            // osetreni vyjimky
        }

        return $query;
    }

    public function updateData() : Nette\Database\Context
    {
        return $query;
    }
}

Editoval Desttro (19. 10. 2018 11:55)