Postgresql: est-il préférable d'utiliser plusieurs bases de données avec un schéma chacune, ou une base de données avec plusieurs schémas?

après ce commentaire à une de mes questions, je me demande s'il vaut mieux utiliser 1 Base de données avec des schémas X ou vice versa.

Ma situation: je développe une application web où, lorsque les gens s'inscrivent, je crée (en fait) une base de données (non, ce n'est pas un réseau social: tout le monde doit avoir accès à ses propres données et ne jamais voir les données de l'autre utilisateur).

C'est la façon dont j'ai utilisé pour la version précédente de mon application (qui est toujours en cours d'exécution sur mysql): à travers l'api plesk, pour chaque enregistrement, je fais:

  1. Créer une base de données de l'utilisateur avec des privilèges limités;
  2. créer une base de données à laquelle l'utilisateur précédent et le superutilisateur (pour la maintenance) peuvent accéder
  3. peupler le db

maintenant, je vais devoir faire la même chose avec postgresql (le projet devient mature et mysql.. ne pas remplir tous les besoins)

j'ai besoin d'avoir toutes les bases de données/schémas de sauvegardes indépendantes: pg_dump fonctionne parfaitement dans les deux sens, la même chose pour les utilisateurs qui peuvent être configurés pour accéder à seulement 1 schéma ou 1 Base de données.

donc, en supposant que vous êtes des utilisateurs plus expérimentés de potsgres que moi, quelle est selon vous la meilleure solution pour ma situation, et pourquoi?

y aura-t-il des différences de rendement en utilisant $x db au lieu de $x schèmes? Et ce la solution sera mieux pour maintenir dans l'avenir (fiabilité)?

Edit : j'ai presque oublié: toutes mes bases de données / schémas auront toujours la même structure!

Edit2 : pour la question des sauvegardes (en utilisant pg_dump), est peut-être mieux en utilisant 1 db et de nombreux schémas, dumping de tous les schémas à la fois: récupérer sera très simple de charger le dump principal dans une machine dev et puis dump et restaurer juste le schéma nécessaire: il y a 1 étape supplémentaire, mais le dumping de tous les schémas semblent plus rapide que le dumpin eux un par un.

p.s: désolé si j'ai oublié certains, " W " - char dans le texte, mon clavier souffrir de bouton ;)

mise à jour 2012

Eh bien, la structure de l'application et la conception sont tellement dirung ces deux dernières années. J'utilise toujours l'approche 1 db with many schemas , mais j'ai quand même une base de données pour chaque version de mon application:

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

pour les sauvegardes, je décharge chaque base de données régulièrement, puis je déplace les sauvegardes sur le serveur dev.

Im utilise également la sauvegarde PITR/WAL mais, comme je l'ai dit avant, il est peu probable que je vais avoir à restaurer toute la base de données à la fois.. donc, il sera probablement rejeté cette année (dans ma situation n'est pas la meilleure approche).

L'1-db-nombreux-schéma de l'approche travaillé très bien pour moi depuis maintenant, même si la structure de l'application est totalement changée:

j'ai presque oublié: toutes mes bases de données / schémas auront toujours la même structure!

...maintenant, chaque schéma a sa propre structure qui change dinamycally en réagissant au flux de données des utilisateurs.

111
demandé sur Community 2009-07-20 12:45:46

6 réponses

PostgreSQL "schéma" est à peu près le même comme une base de données MySQL "base de données". Avoir beaucoup de bases de données sur une installation PostgreSQL peut devenir problématique; avoir beaucoup de schémas fonctionnera sans problème. Donc, vous voulez certainement aller avec une base de données et plusieurs schémas dans cette base de données.

84
répondu kquinn 2009-07-21 02:25:46

définitivement, j'opterai pour l'approche 1-db-plusieurs-schémas. Cela me permet de vider toute la base de données mais de restaurer seulement 1 très facilement, de plusieurs façons:

  1. Dump de la db (tous le schéma), charge le dump dans une nouvelle db, dump juste le schéma dont j'ai besoin, et de restaurer en db principaux
  2. déchargez le schéma séparément, un par un (mais je pense que la machine va souffrir plus de cette façon - et j'attends Comme 500 schémas!)

sinon, googler autour de j'ai vu qu'il n'y a pas d'auto-procédure pour dupliquer un schéma (en utilisant un comme un modèle), mais beaucoup suggèrent cette façon:

  1. créer un modèle-schema
  2. si vous devez dupliquer, renommez-le avec un nouveau nom
  3. Dump
  4. le Renommer en arrière
  5. Restaurer la sauvegarde
  6. la magie est faite.

J'ai écrit 2 lignes en python pour le faire; j'espère qu'ils pourront aider quelqu'un (en-2-secondes-code écrit, ne l'utilisez pas dans la production):

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
répondu Strae 2015-12-01 11:11:39

je dirais, aller avec plusieurs bases de données ET plusieurs schémas :)

Les schémas

dans postgres ressemblent beaucoup à des paquets dans Oracle, au cas où vous les connaissez. Les bases de données sont conçues pour différencier des ensembles entiers de données, tandis que les schémas ressemblent davantage à des entités de données.

par exemple, vous pourriez avoir une base de données pour une application entière avec les schémas" UserManagement"," LongTermStorage " et ainsi de suite. "UserManagement" serait alors contient la table "User", ainsi que toutes les procédures stockées, les déclencheurs, les séquences, etc. qui sont nécessaires pour la gestion des utilisateurs.

les bases de données sont des programmes entiers, les schémas sont des composants.

7
répondu 2009-07-20 14:09:09

un certain nombre de schémas devraient être plus légers qu'un certain nombre de bases de données, bien que je ne puisse trouver de référence qui le confirme.

mais si vous voulez vraiment garder les choses très séparées (au lieu de remanier l'application web de sorte qu'une colonne "costomer" soit ajoutée à vos tables), vous pouvez toujours vouloir utiliser des bases de données séparées: j'affirme que vous pouvez plus facilement faire restaure de la base de données d'un client particulier de cette façon -- sans déranger l'autre client.

3
répondu Troels Arvin 2009-07-20 20:42:02

dans un contexte postgrès je recommande d'utiliser un db avec plusieurs schémas, comme vous pouvez (par exemple) UNION tous les schémas mais pas toutes les bases de données. Pour cette raison, une base de données est complètement isolée d'une autre base de données, tandis que les schémas ne sont pas isolés des autres schémas de la même base de données. Si vous - pour une raison quelconque-devez consolider les données à travers les schémas à l'avenir, il sera facile de le faire sur plusieurs schémas. Avec plusieurs bases de données, vous auriez besoin de plusieurs db-connections et de recueillir et fusionner les données de chaque base de données "manuellement" par la logique d'application.

ces derniers ont des avantages dans certains cas, mais pour la plupart, je pense que l'approche une base de données-plusieurs schémas est plus utile.

2
répondu emax 2016-08-04 17:55:23

Obtenir les choses au clair, d'Abord, la plupart du temps vous voulez faire Quelques Db en lecture Seule et d'autres en lecture/écriture Afin de garder le schéma utilisé en Lecture seule peuvent être conservés sur diff Db Et en lecture/écriture Schéma dans Diff base de données bien que je vous suggère de garder MAX 25-30 schéma dans un DB que vous ne voulez pas créer une charge sur la base de données des journaux de tous les schéma

voici un article si vous voulez en savoir plus

-1
répondu Danish Shaikh 2017-11-14 04:40:07