Postgresql: czy lepiej używać wielu baz danych z jednym schematem każda, czy 1 baza danych z wieloma schematami?

Po Ten komentarz do jednego z moich pytań, zastanawiam się czy lepiej używać 1 bazy danych ze schematami X czy odwrotnie.

Moja sytuacja: rozwijam aplikację internetową, w której kiedy ludzie się rejestrują, tworzę (w rzeczywistości) bazę danych (nie, nie jest to sieć społecznościowa: każdy musi mieć dostęp do swoich danych i nigdy nie widzieć danych innego użytkownika).

W ten sposób wykorzystałem poprzednią wersję mojej aplikacji (która nadal działa na mysql): poprzez plesk api, przy każdej rejestracji robię:

  1. Tworzenie użytkownika bazy danych z ograniczonymi uprawnieniami;
  2. Utwórz bazę danych, do której dostęp może uzyskać tylko poprzedni utworzony użytkownik i superużytkownik (w celu konserwacji)
  3. wypełnić db

Teraz będę musiał zrobić to samo z postgresql (projekt jest coraz dojrzały i mysql.. nie spełniaj wszystkich potrzeb)

Muszę mieć niezależne kopie zapasowe wszystkich baz danych/schematów: pg_dump działa idealnie w obie strony, to samo dotyczy użytkowników, którzy mogą być skonfigurowani do dostępu tylko do 1 schematu lub 1 bazy danych.

Więc, zakładając, że jesteś bardziej doświadczonym użytkownikiem potsgres niż ja, co Twoim zdaniem jest najlepszym rozwiązaniem dla mojej sytuacji i dlaczego?

Czy będą różnice w wydajności przy użyciu $X db zamiast $ x schemas? A jakie rozwiązanie będzie lepsze do utrzymania w przyszłości (niezawodność)?

Edit: prawie zapomniałem: wszystkie moje bazy danych / Schematy będą zawsze miały takie same struktura!

Edit2: W przypadku problemów z kopiami zapasowymi (używając pg_dump), może lepiej używać 1 db i wielu schematów, dumping wszystkich schematów na raz: odzyskiwanie będzie dość proste ładowanie głównego zrzutu w maszynie deweloperskiej, a następnie zrzut i przywrócenie tylko schematu potrzebne: istnieje 1 dodatkowy krok, ale dumping wszystkich schematów wydaje się szybszy, a następnie dumpin je jeden po drugim.

P. s: sorry jeśli zapomniałem jakiegoś znaku 'W' w tekście, moja klawiatura cierpi na ten przycisk;)

UPDATE 2012

Cóż, struktura i projekt aplikacji zostały zmienione tak bardzo dirung przez ostatnie dwa lata. Nadal używam podejścia 1 db with many schemas, ale nadal mam 1 bazę danych dla każdej wersji mojej aplikacji:

Db myapp_01
    \_ my_customer_foo_schema
    \_ my_customer_bar_schema
Db myapp_02
    \_ my_customer_foo_schema
    \_ my_customer_bar_schema

W przypadku kopii zapasowych, im wysypianie każdej bazy danych regularnie, a następnie przenoszenie kopii zapasowych na serwerze deweloperskim.

Im również za pomocą kopii zapasowej PITR / WAL, ale, jak powiedziałem wcześniej, nie jest prawdopodobne, że będę musiał przywrócić wszystkie bazy danych na raz.. więc pewnie będzie zwolniony w tym roku(w mojej sytuacji nie jest najlepszym podejściem).

Podejście 1-db-many-schema działało bardzo dobrze dla mnie od teraz, nawet jeśli struktura aplikacji jest całkowicie zmieniona:

Prawie zapomniałem: wszystkie moje bazy danych/Schematy będą zawsze miały tę samą strukturę!

...teraz każdy schemat ma swoją własną strukturę, która zmienia dinamycznie reagując na przepływ danych użytkowników.

Author: Community, 2009-07-20

6 answers

"schemat" PostgreSQL jest mniej więcej taki sam jak "baza danych"MySQL. Posiadanie wielu baz danych na instalacji PostgreSQL może być problematyczne; posiadanie wielu schematów będzie działać bez problemów. Więc zdecydowanie chcesz przejść z jednej bazy danych i wielu schematów w tej bazie danych.

 84
Author: kquinn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-21 02:25:46

Zdecydowanie, pójdę na podejście 1-db-many-schemas. To pozwala mi zrzucić całą bazę danych, ale przywrócić tylko 1 bardzo łatwo, na wiele sposobów:

  1. zrzuć db( cały schemat), załaduj zrzut do nowego db, zrzuć tylko potrzebny schemat i przywróć z powrotem do głównego db
  2. zrzucić schemat oddzielnie, jeden po drugim (ale myślę, że maszyna będzie cierpieć więcej w ten sposób - i oczekuję jak 500 schematów!)

W przeciwnym razie, googlując wokół widziałem, że nie ma automatyczna procedura powielania schematu (używając jednego jako szablonu), ale wiele z nich sugeruje ten sposób:

  1. Tworzenie szablonu-schematu
  2. Gdy trzeba powielić, Zmień nazwę z nową nazwą
  3. wyrzuć to
  4. Zmień nazwę z powrotem
  5. Przywróć zrzut
  6. Magia jest skończona.

Napisałem 2 wiersze w Pythonie, aby to zrobić; mam nadzieję, że mogą komuś pomóc (w-2-sekund-written-code, nie używaj go w produkcji):

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()
 20
Author: Strae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-01 11:11:39

Powiedziałbym, idź z wieloma bazami danych i wieloma schematami:)

Schematy w postgres są podobne do pakietów w Oracle, jeśli je znasz. Bazy danych mają na celu rozróżnienie całych zestawów danych, podczas gdy schematy są bardziej jak jednostki danych.

Na przykład, możesz mieć jedną bazę danych dla całej aplikacji ze schematami "UserManagement", "LongTermStorage" i tak dalej. "UserManagement" będzie wtedy zawierać tabelę "User", a także wszystkie procedury przechowywane, wyzwalacze, sekwencje itp. które są potrzebne do zarządzania użytkownikami.

Bazy danych to całe programy, Schematy to Komponenty.

 7
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-20 14:09:09

Szereg schematów powinien być bardziej lekki niż szereg baz danych, chociaż nie mogę znaleźć odniesienia, które to potwierdza.

Ale jeśli naprawdę chcesz trzymać rzeczy oddzielnie (zamiast refaktoryzować aplikację internetową tak, że kolumna "costomer" jest dodawana do tabel), możesz nadal używać oddzielnych baz danych: twierdzę, że możesz łatwiej dokonać przywracania bazy danych konkretnego klienta w ten sposób-bez przeszkadzania innym klientom.

 3
Author: Troels Arvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-20 20:42:02

W kontekście postgresowym zalecam użycie jednego db z wieloma schematami, ponieważ można (np.) łączyć wszystkie schematy, ale nie wszystkie bazy danych. Z tego powodu baza danych jest tak naprawdę całkowicie izolowana od innej bazy danych, podczas gdy Schematy nie są izolowane od innych schematów w tej samej bazie danych. Jeśli z jakiegoś powodu będziesz musiał skonsolidować dane między schematami w przyszłości, łatwo będzie to zrobić na wielu schematach. Z wieloma bazami danych potrzebujesz wielu połączeń db i zbierać i scalać dane z każdej bazy danych "ręcznie" przez logikę aplikacji.

Te ostatnie mają w niektórych przypadkach zalety, ale w głównej części uważam, że podejście one-database-multiple-Schema jest bardziej przydatne.

 2
Author: emax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-04 17:55:23

Get the things clear First most the time you would like to make Some Db read Only and Some read / write So keep schema used as Read only can be keep on Diff Db And read/write Schema in Diff database which I would suggest you to keep MAX 25-30 schema in one DB as you don ' t want to create a load on the database for logs for all schema

Oto jeden artykuł, jeśli chcesz przeczytać więcej

 -1
Author: Danish Shaikh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-14 04:40:07