Tôi cần nhập dữ liệu từ cơ sở dữ liệu cũ sang cơ sở dữ liệu mới, với cấu trúc hơi khác nhau. Ví dụ, trong cơ sở dữ liệu cũ, có một bảng ghi lại nhân viên và người giám sát của họ:
CREATE TABLE employee (ident TEXT PRIMARY KEY, name TEXT, supervisor_name TEXT)
Bây giờ, cơ sở dữ liệu mới như sau:
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));
Đó là, thay vì bảng nhân viên đơn giản với tên của người giám sát của họ, cơ sở dữ liệu mới (chung chung hơn) cho phép tạo các nhóm người. Các nhân viên là thành viên có vai trò 'e'
, giám sát viên với vai trò 's'
.
Câu hỏi là làm thế nào để dễ dàng di chuyển dữ liệu từ employee
cấu trúc mới, một nhóm cho mỗi cặp nhân viên giám sát. Ví dụ: nhân viên
employee: ('abc01', 'John', 'Dave'), ('abc02', 'Kyle', 'Emily')
sẽ được di cư như
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')
Tôi sẽ xem xét sử dụng CTE sửa đổi dữ liệu, chèn nhân viên và giám sát viên trước, sau đó nhóm giữa họ. Tuy nhiên, CTE chỉ có thể trả về dữ liệu từ hàng của bảng được chèn. Vì vậy, tôi không thể phù hợp với ai là người giám sát của ai.
Giải pháp duy nhất tôi có thể thấy là sử dụng plpgsql
, chỉ đơn giản là lặp lại dữ liệu, giữ ID nhóm được chèn trong một biến tạm thời, sau đó chèn các teammember
hàng thích hợp . Nhưng tôi tò mò liệu có những giải pháp đơn giản hơn hay thanh lịch hơn.
Sẽ có khoảng vài trăm đến vài ngàn nhân viên. Mặc dù nói chung đó là một cách thực hành tốt, nhưng trong trường hợp của tôi, tôi không muốn tạo ID mới dựa trên những cái cũ, vì ID cũ là các chuỗi như thế *.GM2
. Tôi lưu trữ chúng vào old_ident
cột để tham khảo.
team
sẽ giữ ID của người mà nhóm được tạo sẽ giải quyết vấn đề. Tôi vẫn tò mò liệu có một giải pháp thanh lịch hơn (nghĩa là không sử dụng DDL) hay không.