DOC.PROTOTYPES.RU

Главная > Базы данных > PostgreSQL > Кластерные решения > dblink > Структура >

Равномерное распределение с помощью 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');

-- А так, можно удалить всю эту фигню:
-- DROP USER MAPPING FOR postgres SERVER index_db;
-- DROP USER MAPPING FOR postgres SERVER storage_01;
-- DROP USER MAPPING FOR postgres SERVER storage_02;
-- DROP SERVER index_db;
-- DROP SERVER storage_01;
-- DROP SERVER storage_02;
-- DROP FOREIGN DATA WRAPPER postgresql;

На этом все. Самое время заняться самым интересным...

Сергей Томулевич aka Phoinix (01.12.2009 г.)
Valid HTML 4.01 Transitional
Copyright © 2011 Сергей Томулевич