Creare un database da XML o JSON
Strumenti → Crea database da XML / JSON prende un documento XML o JSON, ricava la struttura relazionale che vi si nasconde e ne costruisce un database — tabelle, colonne, tipi, relazioni e dati.
Serve per il caso in cui un sistema ti consegna un export voluminoso — un catalogo prodotti, un dataset medico o farmaceutico, un dump di API, il file di un partner — e tu lo vuoi come database vero e non come file.
Sono accettati quattro formati: .xml, .json e JSON per righe come .jsonl o .ndjson. Il formato si sceglie dall'estensione; tutto ciò che segue l'analisi iniziale è condiviso, quindi anteprima, DDL generato e caricamento si comportano allo stesso modo da qualunque tu sia partito.
I tre passaggi
1. Impostazione
- File XML / JSON — scegli il documento.
- Connessione di destinazione — dove verrà creato il database.
- Database di destinazione — il nome del database. Per SQLite è il file della connessione.
2. Anteprima
NabuSQL analizza il documento e mostra ciò che ha trovato: le tabelle che creerà, le loro colonne e i tipi dedotti. Il DDL generato può essere ispezionato prima che parta qualcosa.
Leggi bene questo passaggio. È qui che scopri che un campo che ti aspettavi numerico è stato dedotto come testo perché un record su cinquantamila contiene un carattere di troppo.
3. Esecuzione
L'importazione procede con avanzamento per tabella. Alla fine ottieni un esito per tabella: righe caricate ed eventuali errori.
Come viene ricavata la struttura
Da XML
Gli elementi ripetuti diventano tabelle. Attributi e testo degli elementi diventano colonne. Un elemento che compare una sola volta dentro il genitore viene incorporato nel genitore come colonne con prefisso: un blocco <meta><author>…</author></meta> diventa una colonna meta_author e non una tabella a sé con una riga.
Da JSON
La stessa idea, nel vocabolario di JSON:
| Nel documento | Nel database |
|---|---|
| Chiave con uno scalare | Colonna sulla tabella di quell'oggetto |
| Chiave con un oggetto | Incorporata nel genitore come colonne con prefisso |
| Chiave con un array | Tabella figlia con chiave esterna verso il genitore |
| Scalare nudo dentro un array | La colonna _text della tabella |
JSON dice una cosa più chiaramente di quanto XML possa fare: un array significa "molti" anche quando questo particolare file ne contiene uno solo, quindi diventa una tabella a prescindere dalla lunghezza. XML deve dedurre lo stesso dal ripetersi di un tag, il che significa che un elemento figlio isolato appare identico a una collezione che per caso ha un solo membro.
Un array di primo livello è trattato come un elenco di record radice. Un oggetto di primo livello è un unico record radice. Con .jsonl / .ndjson ogni riga è un record radice e le righe vuote vengono saltate.
Poiché JSON non ha un tag radice da cui prendere i nomi, è il nome del file a dare il nome alla tabella radice: catalog.json produce una tabella catalog.
Come funziona
Tre aspetti dell'implementazione contano nella pratica:
- Analisi in due passate. La prima determina la struttura, la seconda carica i dati.
- Memoria. XML e JSON per righe vengono letti in streaming, quindi la dimensione del file è limitata dal disco e non dalla RAM. Un file
.jsonnormale è un unico valore JSON e va interpretato per intero, quindi uno molto grande è limitato dalla memoria. Se controlli l'export, chiedi.ndjson. - Le chiavi esterne si applicano dopo il caricamento. I record sono spesso ordinati in modo che un figlio arrivi prima del genitore; creare i vincoli in anticipo rifiuterebbe righe perfettamente valide. I vincoli si aggiungono alla fine, quando ogni riga è al suo posto.
Dopo
- Controlla i tipi dedotti in Tabelle e colonne e restringi ciò che è uscito più largo del necessario.
- Apri il diagramma ER per vedere la struttura ricavata.
- Aggiungi indici per le colonne che interrogherai davvero: l'importazione crea chiavi e vincoli, non gli indici che servono ai tuoi report.
Se una tabella esce male
La struttura segue il documento. Quando un campo è incoerente tra i record, l'analisi allarga il tipo per accogliere ogni valore incontrato. Correggerlo dopo il caricamento — un ALTER TABLE su un dataset ormai noto — di solito è più rapido che rimodellare il file di origine.
I booleani sorprendono spesso: true / false di JSON vengono salvati come 1 / 0, quindi la colonna esce intera e non testuale.
