Relação entre catálogo, esquema, usuário e instância do database

Para comparar bancos de dados de diferentes fornecedores (Oracle, SQL Server, DB2, MySQL e PostgreSQL), como posso identificar qualquer object exclusivamente e preciso de um catálogo? Por exemplo, em DatabaseMetadata do Java, devo especificar o catalog e schema fooPattern, pelo menos.

É verdade que o catálogo é apenas uma abstração de armazenamento de dados?

No Oracle:

  • instância do servidor == database == catálogo == todos os dados gerenciados pelo mesmo mecanismo de execução
  • schema == namespace no database, idêntico à conta do usuário
  • usuário == proprietário do esquema == conta nomeada, idêntica ao esquema, que pode se conectar ao database, que possui o esquema e usa objects possivelmente em outros esquemas
  • para identificar qualquer object no servidor em execução, você precisa (nome do esquema + nome do object)

No PostgreSQL:

  • instância do servidor == cluster db == todos os dados gerenciados pelo mesmo mecanismo de execução
  • database == catálogo == database único dentro do cluster db, isolado de outros bancos de dados no mesmo cluster db
  • schema == namespace no database
  • usuário == conta nomeada, que pode se conectar ao database, possuir e usar objects em cada database permitido separadamente
  • para identificar qualquer object no servidor em execução, você precisa (nome do database + nome do esquema + nome do object)

No MySQL:

  • instância do servidor == não identificado com o catálogo, apenas um conjunto de bancos de dados
  • database == schema == catalog == um namespace dentro do servidor.
  • usuário == conta nomeada, que pode se conectar ao servidor e usar (mas não pode possuir – nenhum conceito de propriedade) objects em um ou mais bancos de dados
  • para identificar qualquer object no servidor em execução, você precisa (nome do database + nome do object)

No Microsoft SQL Server:

  • instância do servidor == conjunto de bancos de dados gerenciados
  • database == qualificador de namespace no servidor, raramente chamado de catálogo
  • schema == owner == namespace dentro do database, amarrado a funções de database, por padrão apenas dbo é usado
  • usuário == conta nomeada, que pode se conectar ao servidor e usar objects (mas não pode possuir – o esquema funciona como proprietário) em um ou mais bancos de dados
  • para identificar qualquer object no servidor em execução, você precisa (nome do database + proprietário + nome do object)

Então, eu acho que responder às suas perguntas é:

  1. Depende da implementação, se o nome do catálogo é necessário para identificar objects. O significado de “catalog”, “schema” e “database” varia de uma implementação para outra.

  2. Sim, um catálogo é uma abstração de armazenamento de dados. Eu acho que deve ser também definido como um namespace isolado independente, mas nem todos os mecanismos SQL fazem isso.

  3. Banco de dados e esquema são bem definidos por todos os fornecedores. Catálogo às vezes é sinônimo de “database” (pelo menos em Oracle e Postgres), às vezes sinônimo de “esquema” e, às vezes, é sinônimo de ambos. O termo catálogo também significa frequentemente coleta de metadados (também conhecidas como tabelas de sistema).

Para o DB2, o esquema é usado como namespaces. Então, se você quiser identificar exclusivamente um object em um database, você diria * schema.object_name *. Essa é uma maneira muito prática de se obter multitenancy. Você pode ter um esquema separado para cada locatário em seu database. Isso proporciona uma boa separação das preocupações, tanto da segurança quanto dos aspectos de gerenciamento. Você pode ter esquemas de 32 K em um único database DB2.

Um catálogo no DB2 é simplesmente uma coleção de tabelas de sistema que contêm metadados sobre o database. Em geral, é considerado uma prática ruim acessar diretamente os objects do catálogo. É melhor usar os resources fornecidos pela sua API (por exemplo, JDBC) para explorar o catálogo e os metadados que ele contém.

O DB2 também possui outras camadas de abstração. Você pode ter várias instâncias do DB2 em execução na mesma máquina. Cada instância pode gerenciar 256 bancos de dados separados (cada um com esquemas de 32K). O número de instâncias do DB2 em um servidor é limitado apenas pela quantidade de memory disponível. Em um determinado momento, tivemos 120 instâncias do DB2 (cada uma com um database e 10 conexões) em execução no Amazon EC2 m1.large. Você também pode ter várias instalações do DB2 em um único servidor. é útil ao testar uma nova versão para a qual você planeja migrar. Eu acho confuso, embora muitas vezes esquecendo de mudar para a instalação correta.

O que é mencionado aqui sobre o mysql no post by filiprem parece estar incorreto. De acordo com os links a seguir, no mysql o catálogo jdbc corresponde ao database. O esquema jdbc não é suportado.

Intereting Posts