Після цього коментаря до одного з моїх запитань я замислююся, чи краще використовувати одну базу даних із схемами 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-схеми працював для мене дуже добре відтепер, навіть якщо структура програми повністю змінилася:
Я майже забув: усі мої бази даних / схеми завжди матимуть однакову структуру!
... тепер у кожної схеми є своя структура, яка динамічно змінюється, реагуючи на потоки даних користувачів.