web-dev-qa-db-ja.com

カタログ、スキーマ、ユーザー、データベースインスタンスの関係

異なるベンダー(Oracle、SQL Server、DB2、MySQL、およびPostgreSQL)のデータベースを比較するには、どのようにオブジェクトを一意に識別でき、カタログが必要ですか?たとえば、JavaのDatabaseMetadataでは、少なくともカタログとスキーマfooPatternを指定する必要があります。

カタログがデータストレージの単なる抽象化であることは本当ですか?

56
ruruskyi

Oracleの場合:

  • サーバーインスタンス==データベース==カタログ==同じ実行エンジンによって管理されるすべてのデータ
  • スキーマ==データベース内のネームスペース、ユーザーアカウントと同一
  • ユーザー==スキーマ所有者==名前付きアカウント、スキーマと同一、データベースに接続でき、スキーマを所有し、おそらく他のスキーマでオブジェクトを使用する
  • 実行中のサーバーのオブジェクトを識別するには、(スキーマ名+オブジェクト名)が必要です

PostgreSQLの場合

  • サーバーインスタンス== db cluster ==同じ実行エンジンによって管理されるすべてのデータ
  • データベース==カタログ== dbクラスター内の単一データベース、同じdbクラスター内の他のデータベースから分離
  • スキーマ==データベース内の名前空間
  • user ==名前付きアカウント、データベースに接続し、許可された各データベースのオブジェクトを個別に所有および使用できるユーザー
  • 実行中のサーバーのオブジェクトを識別するには、(データベース名+スキーマ名+オブジェクト名)が必要です

MySQLの場合

  • サーバーインスタンス==カタログでは識別されず、データベースのセットのみ
  • データベース==スキーマ==カタログ==サーバー内の名前空間。
  • ユーザー==サーバーに接続して使用できる(ただし、own-所有権の概念なし)オブジェクトを1つ以上のデータベースで使用できる名前付きアカウント
  • 実行中のサーバーのオブジェクトを識別するには、(データベース名+オブジェクト名)が必要です

Microsoft SQL Serverの場合:

  • サーバーインスタンス==管理対象データベースのセット
  • database ==サーバー内のネームスペース修飾子。まれにカタログと呼ばれます
  • スキーマ==所有者==データベース内の名前空間、データベースロールに関連付けられ、デフォルトではdboのみが使用されます
  • user ==名前付きアカウント、サーバーに接続して使用できる(ただし、own-スキーマは所有者として機能できない)1つ以上のデータベースのオブジェクト
  • 実行中のサーバーのオブジェクトを識別するには、(データベース名+所有者+オブジェクト名)が必要です

だから私はあなたの質問への答えは次のとおりだと思う:

  1. オブジェクトを識別するためにカタログ名が必要かどうかは、実装に依存します。 「カタログ」、「スキーマ」、および「データベース」の意味は、実装ごとに異なります。

  2. はい、カタログはデータストレージの抽象化です。自己完結型の独立した名前空間としても定義する必要があると思いますが、すべてのSQLエンジンがそれを行うわけではありません。

  3. Databaseおよびschemaは、すべてのベンダーによって十分に定義されています。 Catalogは、「データベース」(少なくともOracleとPostgresでは)と同義であり、「スキーマ」と同義であり、両方とも同義です。用語catalogは、多くの場合、メタデータコレクション(別名、システムテーブル)も意味します。

110
filiprem

DB2の場合、スキーマは名前空間として使用されます。したがって、データベース内のオブジェクトを一意に識別したい場合、* schema.object_name *と言います。これは、マルチテナンシーを実現するための非常に便利な方法です。データベース内のテナントごとに個別のスキーマを作成できます。これにより、セキュリティと管理の両方の側面から懸念事項を適切に分離できます。 1つのDB2データベースに32Kスキーマを含めることができます。

DB2のカタログは、データベースに関するメタデータを含むシステムテーブルのコレクションです。一般に、カタログオブジェクトに直接アクセスすることは悪い習慣と見なされます。 API(JDBCなど)が提供する機能を使用して、カタログとそれに含まれるメタデータを探索することをお勧めします。

DB2には、他の抽象化レイヤーもあります。同じマシンでDB2の複数のインスタンスを実行できます。各インスタンスは、256個の個別のデータベース(それぞれ32Kスキーマ)を管理できます。サーバー上のDB2インスタンスの数は、使用可能なメモリーの量によってのみ制限されます。ある時点で、Amazon EC2 m1.largeで実行されているDB2の120のインスタンス(それぞれ1つのデータベースと10の接続)がありました。単一のサーバーに複数のDB2をインストールすることもできます。移行する予定の新しいバージョンをテストするときに役立ちます。正しいインストールに切り替えるのを忘れることがよくありますが、混乱を招きます。

5
Leon Katsnelson

Filipremによる投稿でmysqlについてここで言及されていることは間違っているようです。次のリンクによると、mysqlではjdbcカタログはデータベースに対応しています。 jdbcスキーマはサポートされていません。

4
Thejas Nair