Created
May 31, 2017 21:24
-
-
Save mnvx/7c1b07acd14af8d9a97f43b916323ed9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Создаем базы данных | |
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