Равномерное распределение с помощью dblink
Структура кластера
Проксирующая DB
На самом деле, на проксирующей базе данных таблицы располагать не обязательно. Но для каждой из таблиц на внешних базах данных мы должны создать составные типы, а можем и не создавать, так как таблица - тот же составной тип. В общем, на любителя, но мне больше претит создать пустые таблицы соответсвующие таблицам на внешних базах.
Внешние ключи, индексы, последовательности, триггеры и прочие свойства таблиц нам не нужны, так как данных все равно в них не будет.
Таблицы
Скелеты таблиц индексной базы данных
SQL код (1)
CREATE TABLE "public"."index_last_foto" (
"foto_id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"added" TIMESTAMP WITHOUT TIME ZONE NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."index_rating_foto" (
"rating" NUMERIC (5,4) NOT NULL ,
"counter" INTEGER NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."index_tags" (
"id" INTEGER NOT NULL ,
"tag" TEXT NOT NULL ,
"tag_hash" CHAR (4) NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."index_top_foto" (
"foto_id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"rating" NUMERIC (5,4) NOT NULL ,
"old_rating" NUMERIC (5,4) NOT NULL
) WITHOUT OIDS ;
Скелеты таблиц распределенной базы данных
SQL код (2)
-- Тип для поля tags таблицы пользователей нужно сделать заранее
CREATE TYPE "public"."tag_count" AS (
"tag_id" INTEGER ,
"counter" INTEGER
);
CREATE TABLE "public"."users" (
"id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"login" VARCHAR (200) NOT NULL ,
"pass" TEXT NOT NULL
"tags" "public"."tag_count" [],
) WITHOUT OIDS ;
CREATE TABLE "public"."albums" (
"id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"user_id" INTEGER NOT NULL ,
"title" TEXT NOT NULL ,
"count_fotos" INTEGER NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."fotos" (
"id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"album_id" INTEGER NOT NULL ,
"user_id" INTEGER NOT NULL ,
"title" TEXT NOT NULL ,
"filename" VARCHAR (200) NOT NULL ,
"rating" NUMERIC (5,4) NOT NULL ,
"votes_num" INTEGER NOT NULL ,
"votes_sum" INTEGER NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."fotos_tags" (
"foto_id" INTEGER NOT NULL ,
"album_id" INTEGER NOT NULL ,
"user_id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"tag_id" INTEGER NOT NULL ,
"tag_hash" CHAR (4) NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."albums_tags" (
"album_id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"tag_id" INTEGER NOT NULL ,
"counter" INTEGER NOT NULL
) WITHOUT OIDS ;
CREATE TABLE "public"."fotos_votes" (
"foto_id" INTEGER NOT NULL ,
"foto_hash" CHAR (4) NOT NULL ,
"user_id" INTEGER NOT NULL ,
"user_hash" CHAR (4) NOT NULL ,
"vote" SMALLINT NOT NULL
) WITHOUT OIDS ;
А еще типы из индексной базы:
SQL код (3)
CREATE TYPE "public"."command_type" AS ENUM
( 'INSERT' , 'UPDATE' , 'DELETE' );
CREATE TYPE "public"."index_rating_type_command" AS (
"command" "public"."command_type" ,
"foto_id" INTEGER ,
"user_hash" CHAR (4),
"new_rating" NUMERIC (5,4),
"old_rating" NUMERIC (5,4)
);
Создаем связи для внешних баз данных, для postgres 8.4:
SQL код (4)
CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;
CREATE SERVER index_db FOREIGN DATA WRAPPER postgresql OPTIONS (hostaddr '127.0.0.1' , dbname 'db_index' );
CREATE SERVER storage_01 FOREIGN DATA WRAPPER postgresql OPTIONS (hostaddr '127.0.0.1' , dbname 'db_storage_01' );
CREATE SERVER storage_02 FOREIGN DATA WRAPPER postgresql OPTIONS (hostaddr '127.0.0.1' , dbname 'db_storage_02' );
CREATE USER MAPPING FOR postgres SERVER index_db OPTIONS (user 'postgres' , password 'pass' );
CREATE USER MAPPING FOR postgres SERVER storage_01 OPTIONS (user 'postgres' , password 'pass' );
CREATE USER MAPPING FOR postgres SERVER storage_02 OPTIONS (user 'postgres' , password 'pass' );
На этом все. Самое время заняться самым интересным...