¿Cuál es la diferencia entre un catálogo y un esquema en una base de datos relacional?

95

Solía ​​pensar que el esquema era el objeto "contenedor superior" antes de la base de datos. Me refiero DB.schema.<what_ever_object_name_under_schema>.

Bueno, el "contenedor" del catálogo ahora es bastante confuso. ¿Por qué deberíamos necesitar un catálogo? ¿Con qué finalidad, precisamente, debería utilizarse el catálogo?

Stephan
fuente

Respuestas:

73

Desde el punto de vista relacional:

El catálogo es el lugar donde, entre otras cosas, se guardan todos los esquemas (externos, conceptuales, internos) y todas las asignaciones correspondientes (externas / conceptuales, conceptuales / internas).

En otras palabras, el catálogo contiene información detallada (a veces denominada información descriptiva o metadatos ) sobre los diversos objetos que son de interés para el propio sistema.

Por ejemplo, el optimizador utiliza información de catálogo sobre índices y otras estructuras de almacenamiento físico, así como mucha otra información, para ayudarlo a decidir cómo implementar las solicitudes de los usuarios. Asimismo, el subsistema de seguridad utiliza información de catálogo sobre usuarios y restricciones de seguridad para otorgar o denegar tales solicitudes en primer lugar.

Una introducción a los sistemas de bases de datos, 7ª ed., CJ Date, p 69-70.


Desde el punto de vista del estándar SQL:

Los catálogos son colecciones de esquemas con nombre en un entorno SQL. Un entorno SQL contiene cero o más catálogos. Un catálogo contiene uno o más esquemas, pero siempre contiene un esquema llamado INFORMATION_SCHEMA que contiene las vistas y dominios del esquema de información.

Lenguaje de base de datos SQL , (texto revisado propuesto de DIS 9075), p 45


Desde el punto de vista de SQL:

Un catálogo es a menudo sinónimo de base de datos . En la mayoría de las bases de datos SQL, si consulta las vistas de esquema de información, encontrará que los valores de la columna "catálogo_tabla" se asignan al nombre de una base de datos.

Si encuentra que su plataforma utiliza el catálogo de una manera más amplia que cualquiera de estas tres definiciones, puede que se refiera a algo más amplio que una base de datos: un grupo de bases de datos, un servidor o un grupo de servidores. Pero lo dudo un poco, ya que lo habría encontrado fácilmente en la documentación de su plataforma.

Mike Sherrill 'Cat Recall'
fuente
176

Mike Sherrill 'Cat Recall' dio una excelente respuesta . Agregaré simplemente un ejemplo: Postgres .

Clúster = Una instalación de Postgres

Cuando instala Postgres en una máquina, esa instalación se denomina clúster . "Clúster" aquí no se entiende en el sentido de hardware de varias computadoras trabajando juntas. En Postgres, clúster se refiere al hecho de que puede tener varias bases de datos no relacionadas en funcionamiento utilizando el mismo motor de servidor de Postgres.

El estándar SQL también define la palabra clúster de la misma manera que en Postgres. Seguir de cerca el estándar SQL es un objetivo principal del proyecto Postgres.

La especificación SQL-92 dice:

Un clúster es una colección de catálogos definida por la implementación.

y

Exactamente un clúster está asociado con una sesión SQL

Esa es una forma obtusa de decir que un clúster es un servidor de base de datos (cada catálogo es una base de datos).

Clúster> Catálogo> Esquema> Tabla> Columnas y filas

Entonces, tanto en Postgres como en SQL Standard tenemos esta jerarquía de contención:

  • Una computadora puede tener un grupo o varios.
  • Un servidor de base de datos es un clúster .
  • Un clúster tiene catálogos . (Catálogo = Base de datos)
  • Los catálogos tienen esquemas . (Esquema = espacio de nombres de tablas y límite de seguridad)
  • Los esquemas tienen tablas .
  • Las tablas tienen filas .
  • Las filas tienen valores , definidos por columnas .
    Esos valores son los datos comerciales que interesan a sus aplicaciones y usuarios, como el nombre de la persona, la fecha de vencimiento de la factura, el precio del producto y la puntuación más alta del jugador. La columna define el tipo de datos de los valores (texto, fecha, número, etc.).

Diagrama que muestra cajas de anidación que representan cómo la conexión en un puerto lo lleva a un clúster (un servidor de base de datos) que contiene uno o más Catálogos (una base de datos), cada uno de los cuales contiene uno o más Esquemas (un espacio de nombres), cada uno de los cuales contiene tablas, cada uno de los cuales tiene filas.

Múltiples clústeres

Este diagrama representa un solo grupo. En el caso de Postgres, puede tener más de un clúster por computadora host (o sistema operativo virtual). Se suelen realizar varios clústeres para probar e implementar nuevas versiones de Postgres (por ejemplo , 9.0 , 9.1 , 9.2 , 9.3 , 9.4 , 9.5 ).

Si tuvieras varios clústeres, imagina el diagrama de arriba duplicado.

Los diferentes números de puerto permiten que los múltiples clústeres vivan uno al lado del otro, todos en funcionamiento al mismo tiempo. A cada clúster se le asignará su propio número de puerto. Lo habitual 5432es solo el predeterminado y puede configurarlo usted. Cada clúster escucha en su propio puerto asignado las conexiones entrantes de la base de datos.

Escenario de ejemplo

Por ejemplo, una empresa podría tener dos equipos de desarrollo de software diferentes. Uno escribe software para administrar los almacenes mientras que el otro equipo crea software para administrar las ventas y el marketing. Cada equipo de desarrollo tiene su propia base de datos, felizmente inconsciente de la del otro.

Pero el equipo de operaciones de TI tomó la decisión de ejecutar ambas bases de datos en una sola computadora (Linux, Mac, lo que sea). Entonces en esa caja instalaron Postgres. Entonces un servidor de base de datos (clúster de base de datos). En ese grupo, crean dos catálogos, un catálogo para cada equipo de desarrollo: uno llamado 'almacén' y otro llamado 'ventas'.

Cada equipo de desarrollo usa muchas docenas de tablas con diferentes propósitos y roles de acceso. Entonces, cada equipo de desarrollo organiza sus tablas en esquemas. Por coincidencia, ambos equipos de desarrollo realizan un seguimiento de los datos contables, por lo que cada equipo tiene un esquema llamado "contabilidad". Usar el mismo nombre de esquema no es un problema porque los catálogos tienen cada uno su propio espacio de nombres, por lo que no hay colisión.

Además, cada equipo crea finalmente una tabla con fines contables denominada "libro mayor". Una vez más, no hay colisión de nombres.

Puede pensar en este ejemplo como una jerarquía ...

  • Computadora (caja de hardware o servidor virtualizado)
    • Postgres 9.2 cluster (instalación)
      • warehouse catálogo (base de datos)
        • inventory esquema
          • [… algunas mesas]
        • accounting esquema
          • ledger mesa
          • [… Algunas otras tablas]
      • sales catálogo (base de datos)
        • selling esquema
          • [… algunas mesas]
        • accounting esquema (coincidente con el mismo nombre que el anterior)
          • ledger tabla (coincide con el mismo nombre que el anterior)
          • [… Algunas otras tablas]
    • Postgres 9.3 racimo
      • [… Otros esquemas y tablas]

El software de cada equipo de desarrollo establece una conexión con el clúster. Al hacerlo, deben especificar qué catálogo (base de datos) es suyo. Postgres requiere que se conecte a un catálogo, pero no está limitado a ese catálogo. Ese catálogo inicial es simplemente un predeterminado, utilizado cuando sus declaraciones SQL omiten el nombre de un catálogo.

Entonces, si el equipo de desarrollo alguna vez necesita acceder a las tablas del otro equipo, puede hacerlo si el administrador de la base de datos les ha otorgado privilegios para hacerlo. El acceso se realiza con nombres explícitos en el patrón: catalog.schema.table . Entonces, si el equipo de 'almacén' necesita ver el libro mayor del otro equipo (equipo de 'ventas'), escriben declaraciones SQL con sales.accounting.ledger. Para acceder a su propio libro mayor, simplemente escriben accounting.ledger. Si acceden a ambos libros mayores en el mismo código fuente, pueden optar por evitar confusiones al incluir su propio nombre de catálogo (opcional), warehouse.accounting.ledgerversus sales.accounting.ledger.


Por cierto…

Es posible que escuche la palabra esquema utilizada en un sentido más general, es decir, el diseño completo de la estructura de tabla de una base de datos en particular. Por el contrario, en el estándar SQL, la palabra significa específicamente la capa particular en la Cluster > Catalog > Schema > Tablejerarquía.

Postgres usa tanto la base de datos de palabras como el catálogo en varios lugares, como el comando CREATE DATABASE .

No todos los sistemas de bases de datos proporcionan esta jerarquía completa de Cluster > Catalog > Schema > Table. Algunos tienen un solo catálogo (base de datos). Algunos no tienen esquema, solo un conjunto de tablas. Postgres es un producto excepcionalmente poderoso.

Albahaca Bourque
fuente
8
Si es así ...Catalog > Schema..., ¿alguien puede decirme por qué los nodos "Catálogo" y "Esquema" en pgAdmin (interfaz de usuario de PostgreSQL) son nodos hermanos, en lugar del nodo Esquema como nodo secundario del catálogo?
The Red Pea
6
Ese nodo "Esquema" es suyo, pero el nodo "Catálogos" no lo es. El nodo de "Catálogos" tiene exactamente dos elementos: (1) PostgreSQL (pg_catalog), el catálogo del sistema, las docenas de tablas "pg_" que almacenan las definiciones de metadatos de sus bases de datos, tales como pg_index, pg_trigger, y pg_constraint. (2) ANSI (information_schema), la vista de solo lectura del mismo catálogo de sistema definido por el estándar SQL como information_schema. Un mejor nombre para el nodo "Catálogos" en pgAdmin podría ser "Sistema" o "Tablas del sistema".
Basil Bourque
Gracias. "No todos los sistemas de bases de datos proporcionan esta jerarquía completa de Clúster> Catálogo> Esquema> Tabla". Me pregunto cómo es para mysql y SQL Server.
Tim
+1. ¿Todas las tablas de un esquema tienen el mismo esquema relacional (es decir, el mismo conjunto de atributos y / o el mismo conjunto de restricciones)? ¿Podrías ver también mi pregunta stackoverflow.com/questions/48232448/… ? Gracias.
Tim
1
@Tim Un esquema es simplemente un espacio de nombres que separa grupos de tablas, como las carpetas son un espacio de nombres que organiza archivos en un sistema de archivos (excepto que no hay anidamiento de esquemas). Las tablas almacenan los datos de su aplicación como atributos / columnas por fila.
Basil Bourque