ฉันต้องการนำเข้าข้อมูลจากฐานข้อมูลเก่าไปยังฐานข้อมูลใหม่ที่มีโครงสร้างแตกต่างกันเล็กน้อย ตัวอย่างเช่นในฐานข้อมูลเก่ามีพนักงานบันทึกตารางและหัวหน้างานของพวกเขาอยู่:
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
ซึ่งจะวนซ้ำข้อมูลถือ ID ทีมที่แทรกไว้ในตัวแปรชั่วคราวแล้วใส่teammember
แถวที่เหมาะสม แต่ฉันสงสัยว่ามีวิธีแก้ปัญหาที่ง่ายกว่าหรือหรูหรากว่านี้หรือไม่
จะมีพนักงานประมาณหลายร้อยถึงหลายพันคน *.GM2
แม้ว่ามันจะเป็นโดยทั่วไปการปฏิบัติที่ดีในกรณีของฉันฉันจะไม่เหมือนการสร้างรหัสใหม่บนพื้นฐานของคนเก่าเป็นรหัสเก่าสตริงเช่น ฉันเก็บมันไว้ในold_ident
คอลัมน์เพื่ออ้างอิง
team
ซึ่งจะถือ ID ของบุคคลที่ทีมถูกสร้างขึ้นจะช่วยแก้ปัญหาได้ ฉันยังคงสงสัยว่ามีวิธีแก้ปัญหาที่สง่างามกว่า (เช่นใช้ DDL) หรือไม่