Можно ли наследовать данные из другой таблицы в разных схемах? - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь создать собственный список домов, которые пользователь может нанести на карту. Каждый пользователь может создавать дома или редактировать дома, которые они создали. Однако существует общий набор домов, которые должны быть у всех пользователей, и которые нельзя редактировать или удалять.

Пользователи делятся на одну схему для каждого пользователя с таблицей user.houses со списком всех пользовательских домовдля одного пользователя.

Аналогично, таблица public.houses содержит дома, доступные каждому пользователю. Структура этих таблиц идентична.

Есть ли способ не дублировать данные таблицы public.houses во всех таблицах user.houses?

Мне удалось использовать наследование, чтобы гарантировать, чтотаблица user.houses точно соответствует структуре таблицы public.houses. Теперь я хочу сделать это и с данными.

INSERT INTO public.houses id VALUES (1), (2) ;
INSERT INTO user_a.houses id VALUES (3) ;
INSERT INTO user_b.houses id VALUES (4) ;

SELECT id FROM user_b.houses ;

Я ожидаю, что на выходе будут идентификаторы: [1, 2, 4]

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Попробуйте это

SELECT array_agg(a.id) FROM (
    select id from public.houses
    union all
    select id from user_a.houses
    union all
    select id from user_b.houses ) AS a
0 голосов
/ 26 октября 2019

Это слишком долго для комментария.

Возможно, вы уже приняли неверное решение, имея одну схему на пользователя. Есть несколько веских причин для этого - безопасность будет причиной номер один. Если у вас было строгое требование, чтобы данные были разделены. Другая причина может заключаться в том, что пользователи фактически используют разные версии баз данных (свои собственные установки).

При этом обычно лучше поддерживать несколько пользователей в одной базе данных / схеме. Таблицы идентифицируют пользователя для каждого объекта (где это важно). Некоторые таблицы, такие как справочные таблицы, могут совместно использоваться без владельца.

Одна вещь, которую вы можете сделать, это создать представления. Представление:

create view v_user_houses as
    select p.*
    from public.houses p
    union all
    select u.*
    from user.houses u;

Для каждого пользователя вам потребуется отдельное представление.

Альтернативой может быть копирование публикаций во все таблицы пользователей. Когда что-то меняется в общедоступных домах, вы распространяете эти изменения в таблицах домиков пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...