データ量が多いため、アプリケーション DB をスケールアウトする必要があります。PostgreSQL 9.3 上にあります。それで、私は PostgreSQL-XL を見つけました。これはすばらしく見えますが、分散テーブルの制限について理解するのに苦労しています。レプリケーションによってそれらを分散する (すべてのデータノードでテーブル全体がレプリケートされる) ことはまったく問題ありませんが、データノードに沿って「分割」する必要がある 2 つの大きな関連テーブルがあるとします。
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
);
Postgre-XL のドキュメントには、次のように記載されています。
- "(...) 分散テーブルでは、UNIQUE 制約にテーブルの分散列を含める必要があります"
- 「(...)ディストリビューション列は PRIMARY KEY に含める必要があります」
- "(...) REFERENCES (FK) を含む列は分散列にする必要があります。(...) PRIMARY KEY も分散列にする必要があります。"
彼らの例はあまりにも単純すぎて乏しいので、誰かがDISTRIBUTE BY HASH()を使用して postgres-XL の上記の 2 つのテーブルを DDL してくれませんか?
または、スケールアウトする他の方法を提案してください。