Was ist der Unterschied zwischen einem Katalog und einem Schema in einer relationalen Datenbank?

95

Früher dachte ich, Schema sei das "obere Wrapper" -Objekt vor der Datenbank selbst. Ich meine DB.schema.<what_ever_object_name_under_schema>.

Nun, der Katalog "Wrapper" ist jetzt ziemlich verwirrend. Warum sollten wir einen Katalog brauchen? Zu welchem ​​Zweck sollte der Katalog genau verwendet werden?

Stephan
quelle

Antworten:

73

Aus relationaler Sicht:

Der Katalog ist der Ort, an dem unter anderem alle verschiedenen Schemata (extern, konzeptionell, intern) und alle entsprechenden Zuordnungen (extern / konzeptuell, konzeptuell / intern) aufbewahrt werden.

Mit anderen Worten, der Katalog enthält detaillierte Informationen (manchmal auch als Deskriptorinformationen oder Metadaten bezeichnet ) zu den verschiedenen Objekten, die für das System selbst von Interesse sind.

Das Optimierungsprogramm verwendet beispielsweise Kataloginformationen zu Indizes und anderen physischen Speicherstrukturen sowie viele andere Informationen, um zu entscheiden, wie Benutzeranforderungen implementiert werden sollen. Ebenso verwendet das Sicherheitssubsystem Kataloginformationen über Benutzer und Sicherheitsbeschränkungen, um solche Anforderungen überhaupt zu gewähren oder abzulehnen.

Eine Einführung in Datenbanksysteme, 7. Auflage, CJ Date, S. 69-70.


Aus Sicht des SQL-Standards:

Kataloge werden als Sammlungen von Schemas in einer SQL-Umgebung bezeichnet. Eine SQL-Umgebung enthält null oder mehr Kataloge. Ein Katalog enthält ein oder mehrere Schemas, enthält jedoch immer ein Schema mit dem Namen INFORMATION_SCHEMA, das die Ansichten und Domänen des Informationsschemas enthält.

Database Language SQL , (Vorgeschlagener überarbeiteter Text von DIS 9075), S. 45


Aus SQL-Sicht:

Ein Katalog ist oft gleichbedeutend mit Datenbank . Wenn Sie in den meisten SQL-DBMS die Ansichten information_schema abfragen, finden Sie diese Werte in der Spaltenzuordnung "table_catalog", die dem Namen einer Datenbank zugeordnet ist.

Wenn Sie feststellen, dass Ihre Plattform den Katalog breiter als eine dieser drei Definitionen verwendet, bezieht sich dies möglicherweise auf etwas, das breiter als eine Datenbank ist - einen Datenbankcluster, einen Server oder einen Servercluster. Aber ich bezweifle das irgendwie, da Sie das in der Dokumentation Ihrer Plattform leicht gefunden hätten.

Mike Sherrill 'Cat Recall'
quelle
175

Mike Sherrill 'Cat Recall' gab eine ausgezeichnete Antwort . Ich füge nur ein Beispiel hinzu: Postgres .

Cluster = Eine Postgres-Installation

Wenn Sie Postgres auf einem Computer installieren, wird diese Installation als Cluster bezeichnet . "Cluster" ist hier nicht im Hardware-Sinne gemeint, wenn mehrere Computer zusammenarbeiten. In Postgres bezieht sich Cluster auf die Tatsache, dass mehrere nicht verwandte Datenbanken mit derselben Postgres-Server-Engine ausgeführt werden können.

Das Wort Cluster wird vom SQL- Standard auf dieselbe Weise wie in Postgres definiert. Die enge Einhaltung des SQL-Standards ist ein vorrangiges Ziel des Postgres-Projekts.

Die SQL-92- Spezifikation lautet:

Ein Cluster ist eine implementierungsdefinierte Sammlung von Katalogen.

und

Einer SQL-Sitzung ist genau ein Cluster zugeordnet

Das ist eine stumpfe Art zu sagen, dass ein Cluster ein Datenbankserver ist (jeder Katalog ist eine Datenbank).

Cluster> Katalog> Schema> Tabelle> Spalten und Zeilen

Sowohl in Postgres als auch im SQL Standard haben wir diese Containment-Hierarchie:

  • Ein Computer kann einen oder mehrere Cluster haben.
  • Ein Datenbankserver ist ein Cluster .
  • Ein Cluster verfügt über Kataloge . (Katalog = Datenbank)
  • Kataloge haben Schemata . (Schema = Namespace der Tabellen und Sicherheitsgrenze)
  • Schemata haben Tabellen .
  • Tabellen haben Zeilen .
  • Zeilen haben Werte , die durch Spalten definiert sind .
    Bei diesen Werten handelt es sich um die Geschäftsdaten, die Ihren Apps und Benutzern wichtig sind, z. B. Name der Person, Fälligkeitsdatum der Rechnung, Produktpreis und Highscore des Spielers. Die Spalte definiert den Datentyp der Werte (Text, Datum, Nummer usw.).

Diagramm mit Verschachtelungsfeldern, die darstellen, wie Sie durch die Verbindung an einem Port zu einem Cluster (einem Datenbankserver) gelangen, der einen oder mehrere Kataloge (eine Datenbank) enthält, von denen jeder ein oder mehrere Schemas (einen Namespace) enthält, von denen jeder Tabellen enthält, von denen jeder eine hat Reihen.

Mehrere Cluster

Dieses Diagramm zeigt einen einzelnen Cluster. Bei Postgres können Sie mehr als einen Cluster pro Host-Computer (oder virtuellem Betriebssystem) haben. In der Regel werden mehrere Cluster zum Testen und Bereitstellen neuer Versionen von Postgres verwendet (Beispiel: 9.0 , 9.1 , 9.2 , 9.3 , 9.4 , 9.5 ).

Wenn Sie mehrere Cluster hatten, stellen Sie sich das obige Diagramm doppelt vor.

Unterschiedliche Portnummern ermöglichen es den mehreren Clustern, gleichzeitig nebeneinander zu arbeiten. Jedem Cluster würde eine eigene Portnummer zugewiesen. Das Übliche 5432ist nur die Standardeinstellung und kann von Ihnen festgelegt werden. Jeder Cluster wartet auf seinem eigenen zugewiesenen Port auf eingehende Datenbankverbindungen.

Beispielszenario

Ein Unternehmen könnte beispielsweise zwei verschiedene Softwareentwicklungsteams haben. Einer schreibt Software zur Verwaltung der Lager, während das andere Team Software zur Verwaltung von Vertrieb und Marketing erstellt. Jedes Entwicklerteam hat seine eigene Datenbank, ohne die des anderen zu kennen.

Das IT-Betriebsteam entschied sich jedoch, beide Datenbanken auf einer einzigen Computerbox (Linux, Mac usw.) auszuführen. Also haben sie auf dieser Box Postgres installiert. Also ein Datenbankserver (Datenbankcluster). In diesem Cluster erstellen sie zwei Kataloge, einen Katalog für jedes Entwicklerteam: einen mit dem Namen "Warehouse" und einen mit dem Namen "Sales".

Jedes Entwicklerteam verwendet viele Dutzend Tabellen mit unterschiedlichen Zwecken und Zugriffsrollen. So organisiert jedes Entwicklerteam seine Tabellen in Schemata. Zufällig verfolgen beide Entwicklerteams die Buchhaltungsdaten, sodass jedes Team zufällig ein Schema mit dem Namen "Buchhaltung" hat. Die Verwendung des gleichen Schemanamens ist kein Problem, da die Kataloge jeweils einen eigenen Namespace haben, sodass keine Kollision auftritt.

Darüber hinaus erstellt jedes Team schließlich eine Tabelle für Buchhaltungszwecke mit dem Namen "Hauptbuch". Wieder keine Namenskollision.

Sie können sich dieses Beispiel als eine Hierarchie vorstellen…

  • Computer (Hardware-Box oder virtualisierter Server)
    • Postgres 9.2 Cluster (Installation)
      • warehouse Katalog (Datenbank)
        • inventory Schema
          • [… manche Tische]
        • accounting Schema
          • ledger Tabelle
          • [… Einige andere Tabellen]
      • sales Katalog (Datenbank)
        • selling Schema
          • [… manche Tische]
        • accounting Schema (zufälliger gleicher Name wie oben)
          • ledger Tabelle (zufälliger gleicher Name wie oben)
          • [… Einige andere Tabellen]
    • Postgres 9.3 Cluster
      • [… Andere Schemata & Tabellen]

Die Software jedes Entwicklerteams stellt eine Verbindung zum Cluster her. Dabei müssen sie angeben, welcher Katalog (Datenbank) ihnen gehört. Für Postgres müssen Sie eine Verbindung zu einem Katalog herstellen, sind jedoch nicht auf diesen Katalog beschränkt. Dieser anfängliche Katalog ist lediglich eine Standardeinstellung, die verwendet wird, wenn in Ihren SQL-Anweisungen der Name eines Katalogs weggelassen wird.

Wenn das Entwicklerteam jemals auf die Tabellen des anderen Teams zugreifen muss, kann dies der Fall sein, wenn der Datenbankadministrator ihnen die entsprechenden Berechtigungen erteilt hat . Der Zugriff erfolgt mit expliziter Benennung im Muster: catalog.schema.table . Wenn das 'Warehouse'-Team das Hauptbuch des anderen Teams (' Sales'-Team) sehen muss, schreibt es SQL-Anweisungen mit sales.accounting.ledger. Um auf ihr eigenes Hauptbuch zuzugreifen, schreiben sie lediglich accounting.ledger. Wenn sie auf beide Ledger im selben Quellcode zugreifen, können sie Verwirrung vermeiden, indem sie ihren eigenen (optionalen) Katalognamen warehouse.accounting.ledgerangeben sales.accounting.ledger.


Apropos…

Sie können das Wort hören Schema in einem allgemeineren Sinn verwendet, das gesamte Design einer bestimmten Datenbank der Tabellenstruktur bedeutet. Im Gegensatz dazu bedeutet das Wort im SQL-Standard speziell die bestimmte Ebene in der Cluster > Catalog > Schema > TableHierarchie.

Postgres verwendet sowohl die Wortdatenbank als auch den Katalog an verschiedenen Stellen, z. B. im Befehl CREATE DATABASE .

Nicht alle Datenbanksysteme bieten diese vollständige Hierarchie von Cluster > Catalog > Schema > Table. Einige haben nur einen einzigen Katalog (Datenbank). Einige haben kein Schema, nur einen Satz von Tabellen. Postgres ist ein außergewöhnlich starkes Produkt.

Basil Bourque
quelle
8
Wenn ...Catalog > Schema...ja, kann mir jemand sagen, warum "Katalog" - und "Schema" -Knoten in pgAdmin (PostgreSQL-Benutzeroberfläche) Geschwisterknoten anstelle des Schemaknotens als untergeordneter Knoten des Katalogs sind?
Die rote Erbse
6
Dieser "Schema" -Knoten gehört Ihnen, der "Kataloge" -Knoten jedoch nicht. Die „Kataloge“ Knoten hat genau zwei Elemente: (1) PostgreSQL (pg_catalog), den Systemkatalog, die Dutzende von „pg_“ Tabellen, die die Metadaten - Definitionen Ihrer Datenbanken speichern, wie pg_index, pg_triggerund pg_constraint. (2) ANSI (information_schema)die schreibgeschützte Ansicht desselben Systemkatalogs, der durch den SQL-Standard definiert ist als information_schema. Ein besserer Name für den Knoten "Kataloge" in pgAdmin könnte "System" oder "Systemtabellen" sein.
Basil Bourque
Vielen Dank. "Nicht alle Datenbanksysteme bieten diese vollständige Hierarchie von Cluster> Katalog> Schema> Tabelle." Ich frage mich, wie es für MySQL und SQL Server aussieht.
Tim
+1. Haben alle Tabellen in einem Schema dasselbe relationale Schema (dh denselben Satz von Attributen und / oder denselben Satz von Einschränkungen)? Könnten Sie auch meine Frage stackoverflow.com/questions/48232448/… sehen ? Vielen Dank.
Tim
1
@Tim Ein Schema ist nur ein Namespace , der Gruppen von Tabellen trennt, wie Ordner ein Namespace, der Dateien in einem Dateisystem organisiert (außer keine Verschachtelung von Schemas). In Tabellen werden die Daten Ihrer App zeilenweise als Attribute / Spalten gespeichert.
Basil Bourque