postgresql - 从 Postgresql 迁移到 Postgres-XL : distributed tables design

标签 postgresql database-partitioning horizontal-scaling postgres-xl

由于数据量大,我需要扩展我们的应用程序数据库。它在 PostgreSQL 9.3 上。所以,我找到了 PostgreSQL-XL,它看起来很棒,但我很难理解分布式表的局限性。通过复制(在每个数据节点中复制整个表)来分发它们是非常好的,但是假设我有两个大的相关表需要沿着数据节点“分片”:

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 
);

现在 Postgres-XL 文档指出:

  • "(...) 在分布式表中,UNIQUE 约束必须包括 表的分布列"
  • “(...)分布列必须包含在 PRIMARY KEY 中”
  • "(...) 带有 REFERENCES (FK) 的列应该是分布列。 (...) PRIMARY KEY 也必须是分布列。”

他们的示例过于简单和简陋,所以有人可以使用 DISTRIBUTE BY HASH() 将上面两个用于 postgres-XL 的表 DDL 给我吗?

或者建议其他横向扩展方法?

最佳答案

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

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

现在 foos.id = foos_child.foo_id 上的任何连接都可以下推并在本地完成。

关于postgresql - 从 Postgresql 迁移到 Postgres-XL : distributed tables design,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28547437/

相关文章:

database-design - 要索引的列太多 - 使用 mySQL 分区?

mysql - 为博客评论构建数据库表和行

python - Django 服务器不会在 Docker-Compose 中启动

sql - PSQL 连接 - 列 "table.column"不存在

sql - 在另一个表中插入行时如何自动增加一个表中的值

Cassandra 更改主键与触发多个选择查询

postgresql - 如何在为 Hibernate native SQL 查询构建标量投影时注册多个 JDBC Types.OTHER 映射

t-sql - AZURE SQL 截断表分区

php - Laravel 下的负载均衡器 + 集中式 Redis session 服务器