Мені потрібно імпортувати дані зі старої бази даних в нову, з дещо іншою структурою. Наприклад, у старій базі даних є таблиця, що записує працівників та їх керівників:
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
Тепер нова база даних така:
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));
Тобто, замість простої таблиці працівників з іменами їхніх керівників нова (більш загальна) база даних дає змогу створювати команди людей. Співробітники - члени з роллю 'e'
, наглядачі з роллю 's'
.
Питання полягає в тому, як легко перенести дані з employee
нової структури, по одній команді на пару працівника та керівника. Наприклад, співробітники
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
підлягають міграції як
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')
Я б розглядав можливість використання CTE, що модифікує дані, спочатку вставляючи працівників та керівників, а потім команди серед них. Однак CTE може повертати дані лише із вставленого рядка таблиці. Таким чином, я не в змозі зрівнятися з тим, хто був керівником, хто.
Єдине рішення, яке я бачу, - це використання plpgsql
, яке просто перебиратиме дані, утримує вставлені ідентифікатори команди у тимчасовій змінній, а потім вставляє відповідні teammember
рядки. Але мені цікаво, чи існують більш прості чи елегантніші рішення.
Буде приблизно кілька сотень до кількох тисяч співробітників. Хоча це, як правило, добра практика, в моєму випадку я не хотів би генерувати нові ідентифікатори на основі старих, так як старі ідентифікатори - це рядки *.GM2
. Я зберігаю їх у old_ident
стовпці для довідок.
team
якого було б зберігати посвідчення особи, для якої створена команда, вирішило б проблему. Мені все ще цікаво, чи є більш елегантне (тобто, не використовуючи DDL) рішення.