Chúng tôi có rất nhiều máy chủ khác nhau đẩy lên các bảng trung tâm trong Postgres, điều này làm tăng thêm một vấn đề khác. Điều gì sẽ xảy ra nếu tôi thêm một cột vào bảng của mình:
ALTER TABLE item ADD COLUMN category citext;
Bây giờ bảng có bốn cột thay vì ba.
Tất cả các lần đẩy hiện có của tôi ngay lập tức ngắt bởi vì bây giờ thiếu một cột trong các đầu vào. Có 0% cơ hội là chúng tôi có thể cập nhật tất cả máy chủ đồng thời, vì vậy đó không phải là một tùy chọn.
Một giải pháp là tạo loại tùy chỉnh cho từng phiên bản của bảng:
CREATE TYPE item_v1 AS (
id uuid,
marked_for_deletion boolean,
name_ citext);
CREATE TYPE item_v2 AS (
id uuid,
marked_for_deletion boolean,
name_ citext,
category citext);
Và sau đó là một hàm cho mỗi loại:
CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item_v1[])
etc.
CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item_v2[])
etc.
Tôi đoán bạn có thể có một phương thức khổng lồ duy nhất sử dụng anyarray và sử dụng CASE để phân loại mã nào cần chạy. Tôi sẽ không làm điều đó vì một vài lý do, nhưng tôi cho rằng bạn có thể. (Tôi đã thấy cách tiếp cận đó thực sự trở nên tồi tệ bằng nhiều ngôn ngữ.)
Tất cả những điều đó có vẻ như là một chút công việc. Có kỹ thuật nào đơn giản hơn mà tôi đang thiếu không? Tôi đang tưởng tượng rằng bạn có thể gửi văn bản có cấu trúc / XML / JSON, giải nén nó và làm việc từ đó. Nhưng tôi sẽ không tập tin dưới "đơn giản hơn".
Rõ ràng là tôi vẫn đang làm việc thông qua thiết kế ở đây. Tôi đã viết đủ mã để kiểm tra những gì tôi đã trình bày, nhưng muốn sắp xếp các chi tiết trước khi quay lại và triển khai điều này trên hàng chục bảng.
Cảm ơn mọi sự giúp đỡ.