PostgreSQL: Est-il préférable d'utiliser plusieurs bases de données avec un schéma de chacune, ou une base de données avec plusieurs schémas?
Après ce commentaire à une de mes question, je suis en train de penser si il est préférable d'utiliser une base de données avec X schémas ou vice versa.
Ma situation: je suis sur le développement d'une application web où, quand les gens vous inscrire, j'ai créer (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 de ne jamais voir les données de l'utilisateur).
C'est la façon dont j'ai utilisé pour la précédente version de mon application (qui est toujours en cours sur MySQL): grâce à parallels Plesk panel de l'API, pour chaque enregistrement, je n':
- Créer une base de données de l'utilisateur avec des privilèges limités;
- Créer une base de données accessible seulement par le précédent créé d'utilisateur et le super utilisateur (pour l'entretien)
- Remplir la base de données
Maintenant, je vais avoir besoin de faire la même chose avec PostgreSQL (le projet est d'arriver à maturité et MySQL... ne pas satisfaire tous les besoins).
J'ai besoin d'avoir toutes les bases de données/schemas sauvegardes indépendantes: pg_dump fonctionne parfaitement dans les deux sens, et de même pour les utilisateurs qui peut être configuré pour l'accès d'un schéma ou d'une base de données.
En supposant que vous êtes plus expérimenté des utilisateurs de PostgreSQL que moi, que pensez-vous est la meilleure solution pour ma situation, et pourquoi?
Aura-t-il des écarts de rendement à l'aide de $x base de données au lieu de $x schémas? Et quelle solution sera la mieux pour maintenir dans l'avenir (fiabilité)?
Toutes mes bases de données/schemas sera toujours ont la même structure!
Pour les sauvegardes question (à l'aide de pg_dump), est peut-être mieux à l'aide d'une base de données et de nombreux schémas, les déversements de tous les schémas à la fois: la récupération sera très simple de charger le principal dump dans une machine de développement, puis dump et restore juste le schéma nécessaire: il y a une étape supplémentaire, mais dumping tous le schéma semble plus rapide que de vider un par un.
Mise à JOUR 2012
Bien, la structure de l'application et de conception beaucoup changé au cours de ces deux dernières années. Je suis toujours à l'aide de la one db with many schemas
approche, mais tout de même, j'ai une base de données pour chaque version de ma demande:
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 suis dumping chaque base de données régulièrement, et en déplaçant les sauvegardes sur le serveur de développement.
Je suis également en utilisant le PITR/WAL sauvegarde, mais, comme je l'ai dit avant, il n'est pas probable que je vais devoir restaurer de la base de données à la fois... donc il va probablement être rejeté cette année (dans ma situation n'est pas la meilleure approche).
Celui-db-nombreux-schéma approche a très bien fonctionné pour moi, car maintenant, même si la structure de l'application est totalement changé:
J'ai presque oublié: toutes mes bases de données/schemas sera toujours ont la même structure!
...maintenant, à chaque schéma a sa propre structure qui changent de manière dynamique réagissant aux utilisateurs de flux de données.
- "toutes mes bases de données/schemas aura jamais la même structure!" vous voulez dire qu'ils ont tous la même structure? Ou jamais?
- Désolé, oui, ils ont tous la même structure pour toujours: si je change, je vais changer tous 😉
- Si vous avez 1000 clients, cela signifie que vous devez mettre à jour 1000 schéma?
- oui, mais j'ai de la mise à jour de la structure des tables, pas les données.
- Alors, qu'est ce que vous allez faire enfin? Une question, cependant, bien que les performances des requêtes, etc. peut être contrôlé par les tablespaces, les schémas résultant en un rendement équivalent de multi-db vs multi-schéma, aucun impact sur WAL journaux???
- eh bien, le design de l'application a été radical changé au cours du temps... permettez-moi de mettre à jour mes question avec quelques détails
- Comment vous assurer de la sécurité entre les deux schémas? Une connexion DB peut mettre à jour plusieurs Schémas - c'est une aubaine et nue comme bien
Vous devez vous connecter pour publier un commentaire.
Un PostgreSQL "schéma" est à peu près le même comme une base de données MySQL "base de données". Ayant de nombreuses bases de données sur une installation de PostgreSQL pouvez obtenir problématique; avoir de nombreux schémas fonctionnera sans aucun problème. Si vous voulez absolument aller avec une base de données et plusieurs schémas dans la base de données.
dblink
Postgres extension pour des requêtes dans les bases de données maintenant (c'est une réponse à @mattb commentaire).postgres_fdw
permet l'interrogation sur Pg bases de données (OMI mieux quedblink
).public
) dans un cluster doit être fine.Certainement, je vais y aller pour celui-db-nombre de schémas d'approche. Cela me permet de vider toutes les base de données, mais restaurer qu'un très facilement, à de nombreux égards:
Sinon, googler autour, j'ai vu qu'il n'y a pas d'auto-procédure pour reproduire un schéma (à l'aide de l'un comme modèle), mais beaucoup d'entre eux suggèrent de cette façon:
J'ai écrit deux lignes en Python pour le faire; je l'espère, ils peuvent aider quelqu'un (en 2 secondes-écrit-code, ne pas utiliser en production):
Je dirais, aller avec plusieurs bases de données ET plusieurs schémas 🙂
Schémas dans PostgreSQL sont un peu comme les paquets dans Oracle, dans le cas où vous êtes familier avec ceux-ci. Les bases de données sont destinées à différencier entre un ensemble de données, alors que les schémas sont plus comme 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 contenir la table "User", ainsi que toutes les procédures stockées, des déclencheurs, des séquences, etc. qui sont nécessaires pour la gestion des utilisateurs.
Les bases de données sont des programmes complets, les schémas sont des composants.
Un certain nombre de schémas doivent être plus léger qu'un certain nombre de bases de données, bien que je ne peux pas trouver une référence qui confirme ce.
Mais si vous voulez vraiment garder les choses très distinctes (au lieu de refactoring de l'application web de sorte qu'un "client" de la colonne est ajoutée à vos tables), vous pouvez toujours utiliser des bases de données distinctes: j'affirme que vous pouvez plus facilement faire des restaurations d'un client de la base de données de cette façon-sans déranger les autres clients.
Dans un PostgreSQL contexte, je recommande d'utiliser une db avec plusieurs schémas, comme vous pouvez (par exemple) l'UNION de TOUS à travers des schémas, mais pas dans les bases de données. Pour cette raison, une base de données est vraiment complètement isolé à partir d'une autre base de données, tandis que les schémas ne sont pas isolés d'autres schémas dans la même base de données.
Si vous -pour une raison quelconque - ont pour consolider les données à travers des schémas dans l'avenir, il sera facile de le faire sur plusieurs schémas. Avec plusieurs bases de données que vous auriez besoin de plusieurs db-connexions, de recueillir et de fusionner les données de chaque base de données "à la main" par la logique de l'application.
Ces derniers ont des avantages dans certains cas, mais pour la majeure partie, je pense que celui-base de données-plusieurs schémas approche est plus utile.