PostgreSQL внешний ключ на стороннюю базу данных

featurelles
Дата: 17.11.2014 15:30:41
Есть две базы данных.
Основная БД — содержит таблицу и строку, на которую следует ссылаться. (содержит идентификатор пользователя — первичный ключ)
Вторая БД — содержит таблицу, элемент которой, должен ссылаться на первичный ключ (id пользователя) таблицы, находящийся в «Основная БД».
Как это сделать? (как указать при создании таблицы, что следует ссылаться на значение поля,из другой бд )
лопата
Дата: 17.11.2014 15:40:15
featurelles,
никак

или скопировать пк в таблицу своей бд, (см "репликация") и сослаться на неё
featurelles
Дата: 17.11.2014 15:41:47
Т.е. внешние ключи только внутри одной базы данных можно делать?
kjgfnf
Дата: 17.11.2014 15:46:57
featurelles,

"штатно" -- да

если конечно вы не путаете БД и schema
featurelles
Дата: 17.11.2014 16:23:39
Боюсь задать глупый вопрос, но всёже.
Я хочу сделать сайт, с распределением БД по разным серверам. К примеру на сайте есть несколько проектов и я хочу разделить каждый из проектов, так чтоб их бд находились на разных серверах.
При этом у меня есть отдельный сервер с бд, на котором находятся регистрационные данные пользователей, и мне нужно чтоб сохранялась целостность между этими базами.
Т.е. все проекты на отдельных системах, должны указывать на главный сервер с рег. данными. (чтоб оттуда брались идентификаторы..). К сожалению не знаю как это реализовать.

Проект_1_БД ----\
Проект_2_БД --------> Главный сервер БД (идентификаторы)
Проект_3_БД ----/

Пока задуманное не могу даже на одной системе сделать. Тупо создал несколько баз данных, пытаюсь создать связи между таблицами.и нихрена....
А всё в одну базу пихать..не красиво.


Если кто , что может посоветовать...please help
V&N
Дата: 17.11.2014 19:39:42
featurelles, check/trigger dblink/fdw, типа того ...
--create extension postgres_fdw;
--create server postgres_server foreign data wrapper postgres_fdw options (host '8.8.8.8', port '5494', dbname 'postgres');
--create user mapping for public server postgres_server options (password '');

--drop table if exists aa;
create table aa as select i as id, (random()*100)::numeric(10,2) as v from generate_series(1,2) as i;
alter table aa add constraint pk_aa primary key (id);

--drop foreign table if exists f_aa;
create foreign table f_aa (id int, v numeric(10,2)) server postgres_server options (table_name 'aa');

--drop function check_exists_aa(aa_id int) cascade;
create or replace function check_exists_aa(aa_id int) returns boolean language sql as
$$
  select coalesce((select count(*) from f_aa where id = aa_id), 0)=1;
$$;

--drop table if exists bb;
create table bb (id int, a_id int,  v numeric(12,2), constraint pk_bb primary key (id), constraint fk_chk_aa check(check_exists_aa(a_id)) );

insert into bb values (1,1, 0); --ok
insert into bb values (2,3, 0); --error

insert into f_aa values (3,100); 

insert into bb values (2,3, 0); --ok
kamakama
Дата: 18.11.2014 10:53:21
featurelles,

dblink в помощь, да. Там можно создавать подключения к внешним серверам. Но FK не сделать на этом, только ручками писать триггера с проверками, иначе никак.
Maxim Boguk
Дата: 18.11.2014 10:59:27
featurelles
Есть две базы данных.
Основная БД — содержит таблицу и строку, на которую следует ссылаться. (содержит идентификатор пользователя — первичный ключ)
Вторая БД — содержит таблицу, элемент которой, должен ссылаться на первичный ключ (id пользователя) таблицы, находящийся в «Основная БД».
Как это сделать? (как указать при создании таблицы, что следует ссылаться на значение поля,из другой бд )


задача не имеет корректного решения...
вот захотели в основной базе удалить строчку из таблицы на которую стоит ссылаться
и что дальше делать? идти на вторую базу которая может вообще не отвечать (связи нет например) и проверять не нарушится ли FK?

если очень хочется я бы подобную задачу решал бы репликацией таблицы с основной бд на вторую (третью и тд) бд и простановкой FK локально.

А в общем вы что то не то делаете. Если кластер георграфически распределенный - то эту задачу всеравно корректно нельзя решить без дикой потери производительности. Если все локально - 1 база и N схем (а тогда между ними FK нормально ставяться).

--Maxim Boguk
www.postgresql-consulting.ru