リレーショナルデータベースのカタログとスキーマの違いは何ですか?


95

スキーマはデータベース自体の前の「上位ラッパー」オブジェクトだと思っていました。つまりDB.schema.<what_ever_object_name_under_schema>

さて、カタログの「ラッパー」はかなり混乱しています。なぜカタログが必要なのですか?どのような目的で、正確にカタログを使用する必要がありますか?

回答:


73

関係の観点から:

カタログは、さまざまなスキーマ(外部、概念、内部)のすべてと、対応するすべてのマッピング(外部/概念、概念/内部)が保持されている場所です。

言い換えると、カタログには、システム自体に関係するさまざまなオブジェクトに関する詳細情報(記述子情報またはメタデータと呼ばれることもあります)が含まれています。

たとえば、オプティマイザは、インデックスやその他の物理ストレージ構造に関するカタログ情報、およびその他の多くの情報を使用して、ユーザー要求の実装方法を決定するのに役立ちます。同様に、セキュリティサブシステムは、ユーザーとセキュリティの制約に関するカタログ情報を使用して、そもそもそのような要求を許可または拒否します。

データベースシステム入門、第7版、CJ日付、p 69-70。


SQL標準の観点から:

カタログは、SQL環境のスキーマの名前付きコレクションです。SQL環境に0個以上のカタログが含まれています。カタログには1つ以上のスキーマが含まれますが、常に、情報スキーマのビューとドメインを含むINFORMATION_SCHEMAという名前のスキーマが含まれます。

データベース言語SQL、(DIS 9075の提案された改訂テキスト)、p 45


SQLの観点から:

多くの場合、カタログはデータベースと同義です。ほとんどのSQL dbmsでは、information_schemaビューをクエリすると、 "table_catalog"列の値がデータベースの名前にマッピングされていることがわかります。

これらの3つの定義のいずれよりも広い範囲でカタログを使用しているプラ​​ットフォームを見つけた場合、それはデータベースよりも広い範囲(データベースクラスター、サーバー、またはサーバークラスター)を参照している可能性があります。しかし、プラットフォームのドキュメントで簡単にそれを見つけたので、私はそれを少し疑っています。


175

マイク・シェリル「キャット・リコール」素晴らしい答えを出しました。ここでは、Postgresという1つの例を追加します。

クラスター= Postgresのインストール

マシンにPostgresをインストールする場合、そのインストールはクラスターと呼ばれます。ここでの「クラスター」は、複数のコンピューターが連携して動作するというハードウェア的な意味ではありません。Postgresでは、クラスタとは、同じPostgresサーバーエンジンを使用して、複数の無関係なデータベースをすべて起動して実行できるという事実を指します。

クラスタという言葉も、Postgresと同じようにSQL 標準で定義されています。SQL標準に厳密に従うことは、Postgresプロジェクトの主要な目標です。

SQL-92仕様は言います:

クラスターは、実装で定義されたカタログのコレクションです。

そして

正確に1つのクラスターがSQLセッションに関連付けられています

これは、クラスターがデータベースサーバーである(各カタログがデータベースである)と言うのは、あいまいな言い方です。

クラスター>カタログ>スキーマ>テーブル>列と行

したがって、PostgresとSQL標準の両方に、次の包含階層があります。

  • コンピューターには1つのクラスターまたは複数のクラスターがあります。
  • データベースサーバーはクラスターです。
  • クラスターにはカタログがあります。(カタログ=データベース)
  • カタログにはスキーマがあります。(スキーマ= テーブルの名前空間、およびセキュリティ境界)
  • スキーマにはテーブルがあります。
  • テーブルにはがあります
  • 行には、で定義されたがあります
    これらの値は、個人名、請求書の期日、製品の価格、ゲーマーのハイスコアなど、アプリとユーザーが気にするビジネスデータです。この列は、値のデータ型(テキスト、日付、数値など)を定義します

ポートに接続すると、それぞれが1つ以上のスキーマ(名前空間)を含む1つ以上のカタログ(データベース)を含むクラスター(データベースサーバー)にネストするボックスを示す図行。

複数のクラスター

この図は、単一のクラスターを表しています。Postgresの場合、ホストコンピュータ(または仮想OS)ごとに複数のクラスタを持つことができます。(:EX複数のクラスタは、通常のPostgresの新しいバージョンをテストおよび展開するため、行われる9.09.19.29.39.49.5)。

複数のクラスターがある場合は、上の図が複製されていると想像してください。

異なるポート番号により、複数のクラスターが同時に稼働し、同時に稼働します。各クラスターには、独自のポート番号が割り当てられます。通常5432はデフォルトであり、ユーザーが設定できます。各クラスターは、受信データベース接続用に割り当てられた独自のポートでリッスンしています。

シナリオ例

たとえば、1つの企業に2つの異なるソフトウェア開発チームを置くことができます。1人は倉庫を管理するソフトウェアを作成し、もう1人のチームは販売とマーケティングを管理するソフトウェアを作成します。各開発チームには、幸いにも他のデータベースを認識しない独自のデータベースがあります。

しかし、IT運用チームは、両方のデータベースを単一のコンピューターボックス(Linux、Macなど)で実行することを決定しました。そのボックスにPostgresをインストールしました。つまり、1つのデータベースサーバー(データベースクラスター)です。そのクラスターでは、開発チームごとに1つずつ、2つのカタログを作成します。1つは「warehouse」、もう1つは「sales」という名前です。

各開発チームは、目的とアクセスロールが異なる多数のテーブルを使用しています。したがって、各開発チームはテーブルをスキーマに編成します。偶然にも、両方の開発チームが会計データの追跡を行っているため、各チームは偶然にも「会計」という名前のスキーマを持っています。同じスキーマ名を使用しても問題はありません。カタログごとに独自の名前空間があるため、衝突は発生しません。

さらに、各チームは最終的に「元帳」という名前の会計目的のテーブルを作成します。ここでも、名前の衝突はありません。

この例は階層と考えることができます…

  • コンピューター(ハードウェアボックスまたは仮想サーバー)
    • Postgres 9.2 クラスター(インストール)
      • warehouse カタログ(データベース)
        • inventory スキーマ
          • […いくつかのテーブル]
        • accounting スキーマ
          • ledger テーブル
          • […他のいくつかのテーブル]
      • sales カタログ(データベース)
        • selling スキーマ
          • […いくつかのテーブル]
        • accounting スキーマ(上記と同じ名前)
          • ledger テーブル(上記と同じ名前)
          • […他のいくつかのテーブル]
    • Postgres 9.3 集まる
      • […その他のスキーマとテーブル]

各開発チームのソフトウェアがクラスターに接続します。その際、どのカタログ(データベース)であるかを指定する必要があります。Postgresでは1つのカタログに接続する必要がありますが、そのカタログに限定されません。この初期カタログは単なるデフォルトであり、SQLステートメントでカタログの名前が省略されている場合に使用されます。

そのため、開発チームが他のチームのテーブルにアクセスする必要がある場合でも、データベース管理者がアクセスするための特権を付与していれば、アクセスできる可能性があります。アクセスは、パターンの明示的な命名で行われます:catalog.schema.table。したがって、「倉庫」チームが他のチーム(「営業」チーム)の元帳を確認する必要がある場合、SQLステートメントをで記述しsales.accounting.ledgerます。自分の元帳にアクセスするには、単にと書きaccounting.ledgerます。彼らは、ソースコードの同じ部分に両方の元帳にアクセスした場合、彼らは、自分の(オプション)カタログ名を含めることで、混乱を避けるために選択することもwarehouse.accounting.ledgersales.accounting.ledger


ところで…

より一般的な意味で使用されているスキーマという言葉、つまり、特定のデータベースのテーブル構造の設計全体を耳にするかもしれません。対照的に、SQL標準では、この単語は特に階層内の特定の層を意味しCluster > Catalog > Schema > Tableます。

Postgresは、CREATE DATABASEコマンドなどのさまざまな場所で、データベースカタログの両方を使用します

すべてのデータベースシステムがの​​この完全な階層を提供するわけではありませんCluster > Catalog > Schema > Table。一部には単一のカタログ(データベース)しかありません。一部にはスキーマがなく、1セットのテーブルのみがあります。Postgresは非常に強力な製品です。


8
もしそうなら...Catalog > Schema...、なぜpgAdmin(PostgreSQL UI)の「Catalog」ノードと「Schema」ノードが、カタログの子ノードとしてのスキーマノードではなく、兄弟ノードであるのかを誰かに教えてもらえますか?
Red Pea 2015

6
その「スキーマ」ノードはあなたのものですが、「カタログ」ノードはそうではありません。「カタログ」ノードには、ちょうど二つの項目があります:(1) PostgreSQL (pg_catalog)、システムカタログなど、データベースのメタデータ定義を格納「PG_」テーブル、数十人をpg_indexpg_triggerpg_constraint。(2)ANSI (information_schema)、SQL標準でと定義されている同じシステムカタログの読み取り専用ビュー information_schema。pgAdminの「カタログ」ノードのより適切な名前は、「システム」または「システムテーブル」です。
バジルブルク2015

ありがとう。「すべてのデータベースシステムが、クラスター>カタログ>スキーマ>テーブルのこの完全な階層を提供するわけではありません。」mysqlとSQL Serverはどのようなものなのでしょうか。
Tim

+1。スキーマ内のすべてのテーブルに同じリレーショナルスキーマがありますか(つまり、同じ属性セット、同じ制約セット、またはその両方)。私の質問stackoverflow.com/questions/48232448/…もご覧いただけますか?ありがとう。
Tim

1
@Tim スキーマは、フォルダがファイルシステム内のファイルを整理する名前空間を構成するように、テーブルのグループを区切る名前空間にすぎません(スキーマの入れ子を除く)。テーブルは、アプリのデータを属性/列として行ごとに格納します。
バジルブルク2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.