Biraz farklı bir yapıya sahip eski bir veritabanından yeni bir veri aktarmak gerekiyor. Örneğin, eski veritabanında, çalışanları ve amirlerini kaydeden bir tablo vardır:
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
Şimdi, yeni veritabanı aşağıdaki gibidir:
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));
Yani, amirlerinin isimleriyle düz çalışan tablosu yerine, yeni (daha genel) veritabanı, insan ekipleri oluşturmayı sağlar. Çalışanlar rol oynayan üyeler, rol 'e'
süpervizörleridir 's'
.
Soru, verilerin employee
her çalışan-yönetici çifti başına bir ekip olmak üzere yeni yapıya nasıl kolayca taşınacağıdır . Örneğin, çalışanlar
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
olarak taşınacaklar
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')
Önce veri değiştiren bir CTE kullanmayı, önce çalışanları ve amirleri, sonra da ekipleri yerleştirmeyi düşünürdüm. Ancak, CTE yalnızca eklenen tablo satırından veri döndürebilir. Bu yüzden kimin kimin süpervizörü olduğunu eşleştiremiyorum.
Görebildiğim tek çözüm plpgsql
, verileri tekrarlamak, eklenen takım kimliklerini geçici bir değişkente tutmak ve daha sonra uygun teammember
satırları eklemek . Ancak daha basit veya daha zarif çözümler olup olmadığını merak ediyorum.
Kabaca birkaç yüzlerce ila binlerce çalışan olacak. Genellikle iyi bir uygulama olmasına rağmen, benim durumumda, eski kimlikler gibi dizeler olduğu için eski kimliklere dayalı yeni kimlikler oluşturmak istemiyorum *.GM2
. Onları old_ident
referans için sütuna saklıyorum.
team
Ekibin oluşturulduğu kişinin kimliğini tutacak geçici bir tanımlayıcı eklemek sorunu çözecektir. Yine de daha şık (DDL kullanmadan) bir çözüm olup olmadığını merak ediyorum.