web-dev-qa-db-fra.com

Relation entre catalogue, schéma, utilisateur et instance de base de données

Pour comparer les bases de données de différents fournisseurs (Oracle, SQL Server, DB2, MySQL et PostgreSQL), comment puis-je identifier n'importe quel objet de manière unique et ai-je besoin d'un catalogue? Par exemple, dans DatabaseMetadata de Java, je devrais spécifier fooPattern de catalogue et de schéma au moins.

Est-il vrai que le catalogue n'est qu'une abstraction du stockage de données?

56
ruruskyi

Dans Oracle:

  • instance de serveur == base de données == catalogue == toutes les données gérées par le même moteur d'exécution
  • schéma == espace de noms dans la base de données, identique au compte utilisateur
  • utilisateur == propriétaire du schéma == compte nommé, identique au schéma, qui peut se connecter à la base de données, propriétaire du schéma et utiliser des objets éventuellement dans d'autres schémas
  • pour identifier n'importe quel objet dans le serveur en cours d'exécution, vous avez besoin (nom du schéma + nom de l'objet)

Dans PostgreSQL:

  • instance de serveur == cluster db == toutes les données gérées par le même moteur d'exécution
  • base de données == catalogue == base de données unique dans le cluster db, isolée des autres bases de données du même cluster db
  • schéma == espace de noms dans la base de données
  • utilisateur == compte nommé, qui peut se connecter à la base de données, posséder et utiliser des objets dans chaque base de données autorisée séparément
  • pour identifier tout objet dans le serveur en cours d'exécution, vous avez besoin (nom de la base de données + nom du schéma + nom de l'objet)

Dans MySQL:

  • instance de serveur == non identifié avec le catalogue, juste un ensemble de bases de données
  • base de données == schéma == catalogue == un espace de noms au sein du serveur.
  • utilisateur == compte nommé, qui peut se connecter au serveur et utiliser (mais ne peut pas posséder - aucun concept de propriété) des objets dans une ou plusieurs bases de données
  • pour identifier n'importe quel objet dans le serveur en cours d'exécution, vous avez besoin (nom de la base de données + nom de l'objet)

Dans Microsoft SQL Server:

  • instance de serveur == ensemble de bases de données gérées
  • base de données == qualificatif d'espace de noms au sein du serveur, rarement appelé catalogue
  • schéma == propriétaire == espace de noms dans la base de données, lié aux rôles de base de données, par défaut, seul dbo est utilisé
  • utilisateur == compte nommé, qui peut se connecter au serveur et utiliser (mais ne peut pas posséder - le schéma fonctionne en tant que propriétaire) des objets dans une ou plusieurs bases de données
  • pour identifier n'importe quel objet dans le serveur en cours d'exécution, vous avez besoin (nom de la base de données + propriétaire + nom de l'objet)

Je pense donc que la réponse à vos questions est:

  1. Cela dépend de l'implémentation, si le nom du catalogue est nécessaire pour identifier les objets. La signification de "catalogue", "schéma" et "base de données" varie d'une implémentation à l'autre.

  2. Oui, un catalogue est une abstraction du stockage de données. Je pense qu'il devrait également être défini comme un espace de noms isolé autonome, mais tous les moteurs SQL ne le font pas.

  3. La base de données et le schéma sont assez bien définis par tous les fournisseurs. Catalogue est parfois synonyme de "base de données" (au moins dans Oracle et Postgres), parfois synonyme de "schéma" et parfois synonyme des deux. Le terme catalogue signifie aussi souvent collection de métadonnées (aka tables système).

110
filiprem

Pour DB2, le schéma est utilisé comme espaces de noms. Donc, si vous voulez identifier de manière unique un objet dans une base de données, vous diriez * schema.object_name *. Il s'agit d'un moyen très pratique de réaliser la mutualisation. Vous pouvez avoir un schéma distinct pour chaque locataire dans votre base de données. Cela permet de bien séparer les préoccupations des aspects de sécurité et de gestion. Vous pouvez avoir 32K schémas dans une seule base de données DB2.

Un catalogue dans DB2 est simplement une collection de tables système qui contiennent des métadonnées sur la base de données. En général, il est considéré comme une mauvaise pratique d'accéder directement aux objets du catalogue. Il est préférable d'utiliser les fonctionnalités fournies par votre API (par exemple JDBC) pour explorer le catalogue et les métadonnées qu'il contient.

DB2 possède également d'autres couches d'abstraction. Vous pouvez avoir plusieurs instances de DB2 en cours d'exécution sur la même machine. Chaque instance peut gérer 256 bases de données distinctes (chacune avec des schémas 32K). Le nombre d'instances DB2 sur un serveur n'est limité que par la quantité de mémoire dont vous disposez. À un moment donné, nous avions 120 instances de DB2 (chacune avec une base de données et 10 connexions) exécutées sur Amazon EC2 m1.large. Vous pouvez également avoir plusieurs installations de DB2 sur un même serveur. il est utile lors du test d'une nouvelle version vers laquelle vous prévoyez de migrer. Je trouve cela déroutant mais oubliant souvent de passer à la bonne installation.

5
Leon Katsnelson
4
Thejas Nair