Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mnvx/7c1b07acd14af8d9a97f43b916323ed9 to your computer and use it in GitHub Desktop.
Save mnvx/7c1b07acd14af8d9a97f43b916323ed9 to your computer and use it in GitHub Desktop.
-- Создаем базы данных
CREATE DATABASE "sahrding-main" OWNER = dev; -- Основная
CREATE DATABASE "sahrding-part-2016" OWNER = dev; -- Шард 1
CREATE DATABASE "sahrding-part-2017" OWNER = dev; -- Шард 2
-- Следующие запросы выполняем для каждой базы данных sahrding-part-*
-- Создаем таблицы где будут храниться реальные данные.
-- Со всеми необходимыми индексами и ограничениями.
CREATE TABLE content (
id int not null,
published_at timestamp(0) without time zone,
text_data text,
CONSTRAINT report_pkey PRIMARY KEY (id)
);
ALTER TABLE content OWNER TO dev;
CREATE INDEX content_published_at_index
ON content USING btree (published_at);
-- Следующие запросы выполняем на базе "sahrding-main"
-- Для таблицы content не нужны никакие индексы, никакие ограничения.
CREATE TABLE content (
id int not null,
published_at timestamp(0) without time zone,
text_data text
);
ALTER TABLE content OWNER TO dev;
-- С помощью postgres_fdw регистрируем доступ к таблицам content
-- на всех наших шардах
CREATE EXTENSION postgres_fdw;
-- Указываем сервера
DROP SERVER IF EXISTS server2016 CASCADE;
DROP SERVER IF EXISTS server2017 CASCADE;
CREATE SERVER server2016
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', port '5432', dbname 'sahrding-part-2016');
CREATE SERVER server2017
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', port '5432', dbname 'sahrding-part-2017');
-- Указываем пользователей
CREATE USER MAPPING FOR dev SERVER server2016 OPTIONS (user 'dev', password 'мой любимый пароль');
CREATE USER MAPPING FOR dev SERVER server2017 OPTIONS (user 'dev', password 'мой любимый пароль');
-- Регистрируем внешние таблички и указываем критерий распределения данных
CREATE FOREIGN TABLE content2016 (
CHECK (
published_at >= DATE '2016-01-01'
AND published_at < DATE '2017-01-01'
)
) INHERITS (content)
SERVER server2016
OPTIONS (schema_name 'public', table_name 'content');
CREATE FOREIGN TABLE content2017 (
CHECK (
published_at >= DATE '2017-01-01'
AND published_at < DATE '2018-01-01'
)
) INHERITS (content)
SERVER server2017
OPTIONS (schema_name 'public', table_name 'content');
-- Определяем правила добавления данных в content
CREATE RULE content_insert AS ON INSERT TO content DO INSTEAD NOTHING;
CREATE RULE content_update AS ON UPDATE TO content DO INSTEAD NOTHING;
CREATE RULE content_delete AS ON DELETE TO content DO INSTEAD NOTHING;
CREATE RULE content_insert_2016 AS ON INSERT TO content
WHERE (published_at >= DATE '2016-01-01'
AND published_at < DATE '2017-01-01'
)
DO INSTEAD INSERT INTO content2016 VALUES (NEW.*);
CREATE RULE content_insert_2017 AS ON INSERT TO content
WHERE (published_at >= DATE '2017-01-01'
AND published_at < DATE '2018-01-01'
)
DO INSTEAD INSERT INTO content2017 VALUES (NEW.*);
-- Все готово. Теперь пробуем добавлять данные в content
INSERT INTO content(id, published_at, text_data)
VALUES (1, '2016-02-02', 'text 1');
INSERT INTO content(id, published_at, text_data)
VALUES (2, '2017-02-02', 'text 2');
INSERT INTO content(id, published_at, text_data)
VALUES (3, '2016-02-03', 'text 3');
INSERT INTO content(id, published_at, text_data)
VALUES (4, '2016-02-03', 'text 4');
-- Все есть
SELECT * FROM content;
-- Причем на каждом шарде - свои данные
SELECT * FROM content2016;
SELECT * FROM content2017;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment