#.net #database #postgresql
#.net #База данных #postgresql
Вопрос:
Я довольно новичок в PostgreSQL, и у меня есть основной вопрос дизайна, по которому я хотел бы получить совет.
У нашей компании более 1000 идентичных схем, определенных в нашей базе данных PostgreSQL. У нас есть отдельные схемы (рабочие места), определенные для каждого из наших клиентов. Общий дизайн схемы БД — это то, что нельзя изменить.
Мы должны создать подпрограммы, которые будут собирать данные из всех схем и хранить их в таблицах данных в отдельной (централизованной) схеме.
Одним из подходов было бы написать .Сетевое приложение, использующее интерфейс npgsql. Приложение будет перебирать все схемы и запускать динамический (встроенный) SQL для возврата желаемых данных.
Другим подходом было бы поместить все процедуры сбора данных в функции PostgreSQL. Функции будут содержать динамический SQL, принимать схему в качестве параметра, а затем запускать этот SQL для целевой схемы.
Есть ли какая-либо разница в производительности этих двух подходов? Я пытаюсь выяснить, какой подход будет наилучшим с точки зрения производительности и ремонтопригодности.
Есть ли лучший подход?
Спасибо, Джонб
Ответ №1:
Вам просто нужно перемещаться между схемами, используя единственную функцию, определенную в другом месте:
create table public.t (i int);
Создайте функцию в определенной схеме, которая использует объект, общий для всех схем:
create function public.f()
returns t as $$
select * from t;
$$ language sql;
Перейдите к схеме, в которой вы хотите использовать эту функцию:
create schema s1;
set schema 's1';
create table s1.t (like public.t);
insert into s1.t (i) values (1);
Поскольку ‘s1’ является текущей схемой, функция будет запрашивать объект в этой схеме:
select * from public.f();
i
---
1
Поиск параметров при манипулировании схемой search_path