Devo importare dati da un vecchio database a uno nuovo, con una struttura leggermente diversa. Ad esempio, nel vecchio database c'è una tabella che registra i dipendenti e i loro supervisori:
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
Ora, il nuovo database è il seguente:
CREATE TABLE person (id BIGSERIAL PRIMARY KEY, name TEXT, old_ident TEXT);
CREATE TABLE team (id BIGSERIAL PRIMARY KEY);
CREATE TABLE teammember (person_id BIGINT, team_id BIGINT, role CHAR(1));
Cioè, invece della semplice tabella di dipendenti con i nomi dei loro supervisori, il nuovo database (più generico) consente di creare team di persone. I dipendenti sono membri con ruolo 'e'
, supervisori con ruolo 's'
.
La domanda è: come migrare facilmente i dati dalla employee
nuova struttura, un team per coppia dipendente-supervisore. Ad esempio, dipendenti
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
devono essere migrati come
person: (1, 'John', 'abc01'), (2, 'Dave', NULL), (3, 'Kyle', 'abc02'), (4, 'Emily', NULL)
team: (1), (2)
teammember: (1, 1, 'e'), (2, 1, 's'), (3, 2, 'e'), (4, 2, 's')
Vorrei prendere in considerazione l'uso di un CTE che modifica i dati, inserendo prima i dipendenti e i supervisori, quindi i team tra di loro. Tuttavia, CTE può restituire dati solo dalla riga della tabella inserita. Quindi, non sono in grado di eguagliare chi era il supervisore di chi.
L'unica soluzione che posso vedere è l'utilizzo plpgsql
, che semplicemente scorreva sui dati, conteneva gli ID team inseriti in una variabile temporanea e quindi inseriva le teammember
righe appropriate . Ma sono curioso di sapere se esistono soluzioni più semplici o più eleganti.
Ci saranno all'incirca da diverse centinaia a diverse migliaia di dipendenti. Sebbene sia generalmente una buona pratica, nel mio caso, non vorrei generare i nuovi ID in base a quelli vecchi, poiché i vecchi ID sono stringhe come *.GM2
. Le memorizzo nella old_ident
colonna per riferimento.
team
cui contenere l'ID della persona per cui è stata creata la squadra risolverebbe il problema. Sono ancora curioso di sapere se esiste una soluzione più elegante (ovvero, non usare DDL).