Postgresql: лучше ли использовать несколько баз данных с 1 схемой каждая или 1 базу данных с несколькими схемами?
после комментарий на один из моих вопросов, я думаю, лучше ли использовать 1 базу данных со схемами X или наоборот.
моя ситуация: я разрабатываю веб-приложение, где, когда люди регистрируются, я создаю (фактически) базу данных (нет, это не социальная сеть: каждый должен иметь доступ к своим собственным данным и никогда не видеть данные другого пользователя).
Так я использовал для предыдущей версии моего приложения (которое все еще работает на mysql): через api plesk, для каждой регистрации, я делаю:
- создать пользователя базы данных с ограниченными правами;
- создайте базу данных, к которой может получить доступ только предыдущий созданный пользователь и суперпользователь (для обслуживания)
- заполнить БД
теперь мне нужно будет сделать то же самое с postgresql (проект становится зрелым и mysql.. не выполняйте все потребности)
мне нужно иметь все базы данных/схемы резервное копирование независимо: pg_dump отлично работает в обоих направлениях, то же самое для пользователей, которые могут быть настроены для доступа только к 1 схеме или 1 базе данных.
Итак, предполагая, что вы более опытные пользователи potsgres, чем я, как вы думаете, лучшее решение для моей ситуации и почему?
будут ли различия в производительности с использованием $x db вместо $ x схем? И какое решение будет лучше поддерживать в будущем (надежность)?
редактировать: я почти забыл: все мои базы данных / схемы будут всегда имеют ту же структуру!
Edit2: для Проблемы с резервными копиями (с использованием pg_dump), возможно, лучше использовать 1 дБ и многие схемы, сбрасывая все схемы сразу: восстановление будет довольно простой загрузкой основного дампа в машине dev, а затем дамп и восстановить только необходимую схему: есть 1 дополнительный шаг, но сброс всей схемы кажется быстрее, чем сбрасывать их один за другим.
p.субъект: извините, если я забыл некоторые " W " char в тексте, моя клавиатура страдает этой кнопкой ;)
обновление 2012
Ну, структура приложения и дизайн так сильно изменились за последние два года.
Im все еще использует 1 db with many schemas
подход, но все же, у меня есть 1 база данных для каждой версии приложения:
Db myapp_01
_ my_customer_foo_schema
_ my_customer_bar_schema
Db myapp_02
_ my_customer_foo_schema
_ my_customer_bar_schema
для резервных копий im регулярно сбрасывает каждую базу данных, а затем перемещает резервные копии на dev-сервере.
Im также использует PITR/WAL резервная копия, но, как я уже сказал, вряд ли мне придется восстанавливать базы данных сразу.. поэтому, вероятно, в этом году он будет уволен (в моей ситуации это не лучший подход).
подход 1-db-many-schema работал очень хорошо для меня с тех пор, даже если структура приложения полностью изменилась:
я почти забыл: все мои базы данных / схемы будут всегда имеют ту же структуру!
...теперь каждая схема имеет свою структуру, что изменение dinamycally реагируют на пользователей потока данных.
6 ответов
"схема" PostgreSQL примерно такая же, как "база данных"MySQL. Наличие многих баз данных на установке PostgreSQL может стать проблематичным; наличие многих схем будет работать без проблем. Таким образом, вы определенно хотите пойти с одной базой данных и несколькими схемами в этой базе данных.
определенно, я пойду на подход 1-db-many-schemas. Это позволяет мне сбросить всю базу данных, но восстановить только 1 очень легко, во многих отношениях:
- дамп БД (вся схема), загрузите дамп в новую БД, дамп только схема мне нужна, и восстановить обратно в основной БД
- дамп схемы отдельно, один за другим (но я думаю, что машина будет страдать больше таким образом - и я ожидаю, как 500 схем!)
в противном случае, googling вокруг я видел что нет автоматической процедуры для дублирования схемы (используя ее в качестве шаблона), но многие предлагают следующий способ:
- создать шаблон-схемы
- когда нужно дублировать, переименуйте его с новым именем
- дамп
- переименовать его обратно
- восстановить дамп
- магия делается.
Я написал 2 строки в python, чтобы сделать это; я надеюсь, что они могут помочь кому-то (в-2-секунд-написанный-код, не используйте его в производство):
import os
import sys
import pg
#Take the new schema name from the second cmd arguments (the first is the filename)
newSchema = sys.argv[1]
#Temp folder for the dumps
dumpFile = '/test/dumps/' + str(newSchema) + '.sql'
#Settings
db_name = 'db_name'
db_user = 'db_user'
db_pass = 'db_pass'
schema_as_template = 'schema_name'
#Connection
pgConnect = pg.connect(dbname= db_name, host='localhost', user= db_user, passwd= db_pass)
#Rename schema with the new name
pgConnect.query("ALTER SCHEMA " + schema_as_template + " RENAME TO " + str(newSchema))
#Dump it
command = 'export PGPASSWORD="' + db_pass + '" && pg_dump -U ' + db_user + ' -n ' + str(newSchema) + ' ' + db_name + ' > ' + dumpFile
os.system(command)
#Rename back with its default name
pgConnect.query("ALTER SCHEMA " + str(newSchema) + " RENAME TO " + schema_as_template)
#Restore the previus dump to create the new schema
restore = 'export PGPASSWORD="' + db_pass + '" && psql -U ' + db_user + ' -d ' + db_name + ' < ' + dumpFile
os.system(restore)
#Want to delete the dump file?
os.remove(dumpFile)
#Close connection
pgConnect.close()
Я бы сказал, пойдите с несколькими базами данных и несколькими схемами:)
схемы в postgres очень похожи на пакеты в Oracle, если вы знакомы с ними. Базы данных предназначены для различения целых наборов данных, в то время как схемы больше похожи на сущности данных.
например, вы можете иметь одну базу данных для всего приложения со схемами "UserManagement", "LongTermStorage" и так далее. "UserManagement" будет содержать таблицу "User", как также всех хранимых процедур, триггеров, последовательностей и т. д. это необходимо для управления пользователями.
базы данных-это целые программы, Схемы-это компоненты.
ряд схем должен быть более легким, чем ряд баз данных, хотя я не могу найти ссылку, которая подтверждает это.
но если вы действительно хотите сохранить вещи очень отдельными (вместо рефакторинга веб-приложения, чтобы столбец "costomer" был добавлен в ваши таблицы), вы все равно можете использовать отдельные базы данных: я утверждаю, что вы можете легче сделать восстановление базы данных конкретного клиента таким образом-не беспокоя других клиентов.
в контексте postgres я рекомендую использовать одну БД с несколькими схемами, так как вы можете (например) объединить все схемы, но не базы данных. По этой причине база данных действительно полностью изолирована от другой базы данных, в то время как схемы не изолированы от других схем в той же базе данных. Если вам по какой - то причине придется консолидировать данные по схемам в будущем, это будет легко сделать по нескольким схемам. С несколькими базами данных вам понадобится несколько db-соединения и собирать и объединять данные из каждой базы данных "вручную" по логике приложения.
последние имеют преимущества в некоторых случаях, но по большей части я думаю, что подход one-database-multiple-schemas более полезен.
получить вещи ясно сначала самое время вы хотели бы сделать некоторые БД только для чтения и некоторые чтения/записи так держать схему, используемую только для чтения может храниться на diff БД и чтения / записи схемы в базе данных Diff, хотя я бы предложил вам сохранить Макс 25-30 схемы в одной БД, как вы не хотите, чтобы создать нагрузку на базу данных для журналов для всех схемы