Zachování klíčů při update tabulek z JSON feedu s NDB
- Desttro
- Člen | 126
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)