5

Tôi cần mở rộng DB ứng dụng của mình do lượng dữ liệu. Đó là trên PostgreSQL 9.3. Vì vậy, tôi đã tìm thấy PostgreSQL-XL và nó trông tuyệt vời, nhưng tôi đang có một thời gian khó cố gắng để quấn quanh đầu của tôi xung quanh những hạn chế cho các bảng phân phối. Để phân phối chúng bằng cách sao chép (nơi mà toàn bộ bảng được nhân rộng ở mỗi datanode) là khá OK, nhưng chúng ta hãy nói rằng tôi có hai bảng liên quan lớn mà cần phải được "sharded" dọc theo datanodes:Di chuyển từ Postgresql sang Postgres-XL: thiết kế bảng phân phối

CREATE TABLE foos 
(
    id bigserial NOT NULL, 
    project_id integer NOT NULL, 
    template_id integer NOT NULL, 
    batch_id integer, 
    dataset_id integer NOT NULL, 
    name text NOT NULL, 
    CONSTRAINT pk_foos PRIMARY KEY (id), 
    CONSTRAINT fk_foos_batch_id FOREIGN KEY (batch_id) 
     REFERENCES batches (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_foos_dataset_id FOREIGN KEY (dataset_id) 
     REFERENCES datasets (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_foos_project_id FOREIGN KEY (project_id) 
     REFERENCES projects (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_foos_template_id FOREIGN KEY (template_id) 
     REFERENCES templates (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT uc_foos UNIQUE (project_id, name) 
); 

CREATE TABLE foo_childs 
(
    id bigserial NOT NULL, 
    foo_id bigint NOT NULL, 
    template_id integer NOT NULL, 
    batch_id integer, 
    ffdata hstore, 
    CONSTRAINT pk_ff_foos PRIMARY KEY (id), 
    CONSTRAINT fk_fffoos_batch_id FOREIGN KEY (batch_id) 
     REFERENCES batches (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_fffoos_foo_id FOREIGN KEY (foo_id) 
     REFERENCES foos (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE, 
    CONSTRAINT fk_fffoos_template_id FOREIGN KEY (template_id) 
     REFERENCES templates (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE CASCADE 
); 

Bây giờ tài liệu Postgres-XL khẳng định rằng:

  • "(...) trong bảng phân phối, ràng buộc UNIQUE phải bao gồm các cột phân phối của bảng"
  • "(...) cột phân phối phải được bao gồm trong PRIMARY KEY "
  • "(...) cột với TÀI LIỆU THAM KHẢO (FK) phải là cột phân phối. (...) PRIMARY KEY phải cột phân phối là tốt."

ví dụ của họ là qua đơn giản và scarse, vì vậy ai đó có thể xin vui lòng DDL tôi hai bảng trên cho postgres-XL sử dụng PHÂN PHỐI BỞI HASH()?

Hoặc có thể gợi ý những cách khác để mở rộng quy mô ra?

Trả lời

0
CREATE TABLE foos 
(...) DISTRIBUTE BY HASH(id); 

CREATE TABLE foos_child 
(...) DISTRIBUTE BY HASH(foo_id); 

Bây giờ bất kỳ tham gia vào foos.id = foos_child.foo_id có thể được đẩy xuống và thực hiện tại địa phương.

+0

Cảm ơn bạn đã trả lời nhanh nhưng tôi đã thử điều đó trước đây, đó là điều đầu tiên tôi thực sự, không may mắn. Tôi nhận được lỗi này cố gắng tạo bảng đầu tiên: 'ERROR: Chỉ mục duy nhất của bảng được phân đoạn phải chứa cột phân phối băm.' Tôi đoán đó là do ràng buộc duy nhất, vì vậy hãy nói rằng tôi có thể loại bỏ nó, sau đó tôi nhận được lỗi khác: 'ERROR: không có ràng buộc duy nhất khớp với các khóa đã cho cho bảng tham chiếu" lô "và điều này là do cột tham chiếu batch_id là khóa ngoại và phải là cột phân phối trong bảng phân phối, phải không? – Joe

Các vấn đề liên quan