После этого комментария к одному из моих вопросов, я думаю, что лучше использовать одну базу данных с X-схемами или наоборот.
Моя ситуация: я разрабатываю веб-приложение, в котором, когда люди регистрируются, я создаю (на самом деле) базу данных (нет, это не социальная сеть: каждый должен иметь доступ к своим данным и никогда не видеть данные другого пользователя),
То, что я использовал для предыдущей версии моего приложения (которая все еще работает на MySQL): через API Plesk для каждой регистрации я делаю:
- Создать базу данных пользователя с ограниченными правами;
- Создайте базу данных, к которой может обращаться только предыдущий созданный пользователь и суперпользователь (для обслуживания)
- Заполните базу данных
Теперь мне нужно сделать то же самое с PostgreSQL (проект становится зрелым, а MySQL... не удовлетворяет всем требованиям).
Мне нужно, чтобы все резервные копии баз данных/схем были независимыми: pg_dump отлично работает в обоих направлениях и одинаково для пользователей, которые могут быть настроены для доступа только к одной схеме или одной базе данных.
Итак, если вы являетесь более опытным пользователем PostgreSQL, чем я, что вы считаете лучшим решением для моей ситуации и почему?
Будут ли различия в производительности при использовании базы данных $ x вместо схем $ x? И какое решение будет лучше поддерживать в будущем (надежность)?
Все мои базы данных/схемы всегда будут иметь одинаковую структуру!
Что касается проблемы с резервными копиями (с использованием pg_dump), возможно, лучше использовать одну базу данных и несколько схем, создавая дамп всех схем одновременно: восстановление будет довольно простой загрузкой основного дампа на машине разработчика, а затем выгрузкой и восстановлением только необходимой схемы: это еще один шаг, но выгрузка всей схемы кажется быстрее, чем выгрузка одной за другой.
ОБНОВЛЕНИЕ 2012
Ну, структура приложений и дизайн сильно изменились за последние два года. Я по-прежнему использую подход с одной базой данных one db with many schemas
, но, тем не менее, у меня есть одна база данных для каждой версии моего приложения:
Db myapp_01
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Db myapp_02
\_ my_customer_foo_schema
\_ my_customer_bar_schema
Для резервного копирования я регулярно выгружаю каждую базу данных, а затем перемещаю резервные копии на сервер разработки.
Я также использую резервное копирование PITR/WAL, но, как я уже говорил, маловероятно, что мне придется восстанавливать всю базу данных одновременно... поэтому она, вероятно, будет закрыта в этом году (в моей ситуации это не лучший подход).
С тех пор подход one-db-many-schema очень хорошо работал для меня, даже если структура приложения полностью изменилась:
Я почти забыл: все мои базы данных/схемы всегда будут иметь одинаковую структуру!
... теперь каждая схема имеет свою собственную структуру, которая динамически изменяется, реагируя на поток данных пользователя.