Postgresql: est-il préférable d’utiliser plusieurs bases de données avec 1 schéma chacune ou 1 firebase database avec plusieurs schémas?

Après ce commentaire à l’une de mes questions, je pense qu’il vaut mieux utiliser 1 firebase database 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 firebase database (non, ce n’est pas un réseau social: tout le monde doit avoir access à ses propres données et ne jamais voir les données de l’autre utilisateur) ).

C’est comme ça que j’ai utilisé la version précédente de mon application (qui tourne toujours sur mysql): à travers le plesk api, pour chaque enregistrement, je fais:

  1. Créer un utilisateur de firebase database avec des privilèges limités;
  2. Créer une firebase database accessible uniquement par l’utilisateur créé précédemment et le superutilisateur (pour la maintenance)
  3. Remplir la firebase database

Maintenant, je dois faire la même chose avec postgresql (le projet devient mature et mysql .. ne répond pas à tous les besoins)

Je dois avoir toutes les sauvegardes de bases de données / schémas indépendantes: pg_dump fonctionne parfaitement dans les deux sens, de la même manière pour les utilisateurs pouvant être configurés pour accéder à un seul schéma ou à une seule firebase database.

Donc, en supposant que vous soyez des utilisateurs plus expérimentés que moi, que pensez-vous de la meilleure solution pour ma situation et pourquoi?

Y aura-t-il des différences de performances en utilisant $ x db au lieu de schémas $ x? Et quelle solution sera préférable de maintenir à l’avenir (fiabilité)?

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

Edit2 : Pour le problème des sauvegardes (en utilisant pg_dump), il vaut peut-être mieux utiliser 1 db et beaucoup de schémas, vidant tous les schémas à la fois: la restauration sera assez simple pour charger le dump principal : il y a une étape supplémentaire, mais le vidage de tous les schémas semble plus rapide que leur vidage un par un.

ps: désolé si j’ai oublié des caractères “W” dans le texte, mon clavier souffre ce bouton;)

MISE À JOUR 2012

Eh bien, la structure et le design des applications ont tellement changé 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, installez chaque firebase database régulièrement, puis déplacez les sauvegardes sur le serveur de développement.

J’utilise aussi la sauvegarde PITR / WAL mais, comme je l’ai déjà dit, il est peu probable que je doive restaurer toutes les bases de données à la fois. Il sera probablement rejeté cette année (dans ma situation, ce n’est pas la meilleure approche)

L’approche 1-db-many-schema a très bien fonctionné pour moi depuis, même si la structure de l’application est totalement modifié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 réagit de manière dinamyciale au stream de données des utilisateurs.

Un “schéma” PostgreSQL est à peu près identique à une “firebase database” MySQL. Avoir plusieurs bases de données sur une installation PostgreSQL peut être problématique; Avoir plusieurs schémas fonctionnera sans problème. Donc, vous voulez certainement aller avec une firebase database et plusieurs schémas au sein de cette firebase database.

Certainement, je vais passer à l’approche 1-db-many-schémas. Cela me permet de vider toute la firebase database mais de ne restaurer qu’une seule très facilement, de plusieurs manières:

  1. Videz la firebase database (tout le schéma), chargez le fichier dans une nouvelle firebase database, videz uniquement le schéma dont j’ai besoin et restaurez la firebase database principale.
  2. Vider le schéma séparément, un par un (mais je pense que la machine va souffrir de cette façon – et je m’attends à 500 schémas!)

Sinon, googler autour de moi a vu qu’il n’y a pas de procédure automatique pour dupliquer un schéma (en utilisant un comme modèle), mais beaucoup suggèrent ceci:

  1. Créer un schéma-modèle
  2. Si besoin de dupliquer, renommez-le avec un nouveau nom
  3. Jette le
  4. Renommez-le
  5. Restaurer le dump
  6. La magie est faite.

J’ai écrit 2 lignes en python pour le faire; J’espère qu’ils peuvent aider quelqu’un (en 2 secondes, en code écrit, ne pas l’utiliser en 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() 

Je dirais, allez avec plusieurs bases de données ET plusieurs schémas 🙂

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

Par exemple, vous pourriez avoir une firebase database pour une application entière avec les schémas “UserManagement”, “LongTermStorage” et ainsi de suite. “UserManagement” contiendrait alors la table “User”, ainsi que toutes les procédures stockées, les déclencheurs, les séquences etc. nécessaires à la gestion des utilisateurs.

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

Un certain nombre de schémas devraient être plus légers qu’un certain nombre de bases de données, même si je ne trouve pas de référence pour le confirmer.

Mais si vous voulez vraiment garder les choses très séparées (au lieu de refactoriser l’application Web pour append une colonne “costomer” à vos tables), vous souhaiterez peut-être utiliser des bases de données distinctes: la firebase database d’un client particulier de cette façon – sans déranger les autres clients.

Dans un contexte postgres, je recommande d’utiliser une firebase database avec plusieurs schémas, comme vous pouvez (par exemple) UNION ALL à travers les schémas, mais pas entre les bases de données. Pour cette raison, une firebase database est vraiment complètement isolée d’une autre firebase database, tandis que les schémas ne sont pas isolés des autres schémas de la même firebase database. Si, pour une raison quelconque, vous devez consolider des données entre des schémas à l’avenir, il sera facile de le faire sur plusieurs schémas. Avec plusieurs bases de données, vous avez besoin de plusieurs connexions de firebase database et collectez et fusionnez les données de chaque firebase database “manuellement” par la logique de l’application.

Ces derniers ont des avantages dans certains cas, mais pour l’essentiel, je pense que l’approche à firebase database unique et à schémas multiples est plus utile.

Dégagez les choses Tout d’abord, le temps que vous souhaitez consacrer en lecture seule et en lecture / écriture. Garder le schéma en lecture seule peut être conservé sur diff Db et lire / écrire le schéma dans la firebase database Diff. MAX 25-30 schéma dans une seule firebase database car vous ne voulez pas créer de charge sur la firebase database pour les journaux de tous les schémas

Voici un article si vous voulez en savoir plus