4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

データベースのスキーマとは何か。(三層スキーマ、PostgreSQL/SQLServer/OracleDB/MySQL)

Posted at

記事を書いた経緯

これまで色々なDBを利用し開発を行ってきましたが、「スキーマ」の言葉がよく出てきました。
出てくる度に、調べてはなんとなーく理解して、を繰り返し結局毎回頭に残らないので、記事に残すことにしました。

「スキーマ」とは

まず、データベースに限らない広い意味での「スキーマ」という言葉の意味は、「おおまかな概念(状態)や構造」と理解しました。

wikipediaによると
スキーマとは、もともと図や図式や計画のことを指す言葉で、今では様々な分野で広く用いられる言葉。「スキーム」と「スキーマ」はほぼ同じ意味であるが、一般にスキームが具体的にほとんど完成された計画や図を意味するのに比べて、スキーマはその手前のおおまかな(概念)状態を指すことが多い。

データベースの概念的な意味で使われる「スキーマ」とデータベース個々で使われる「スキーマ」は別

OracleDBを利用したシステムの開発時に、同じデータベース内に同名のテーブルを2つ作成し、WEBアプリからとバッチからで参照先を変えたい事象が発生しました。
スキーマ分けたら大丈夫だから」と上司に言われ、スキーマってなんだっけ?どう使うんだっけ?と思い【スキーマ データベース】で調べました。

するとでてきたのは「三層スキーマ」等の概念的な言葉で、なんか知りたいのと違う・・使い方が書いてない・・もやもや。という状態に。

データベースの概念的な「スキーマ」と、個々のデータベースでの「スキーマ」は別だと認識して調べた方が良さそうです。
上記のように、開発でスキーマを利用する必要がある場合は【スキーマ データベース】ではなく【スキーマ OracleDB】のように、データベース名を指定して調べるべきでしたね。

データベースの概念的な意味で使われる「スキーマ」

データベースの概念的な意味で使われる「スキーマ」はデータベースの構造のことであり、設計時に利用される言葉かなと思います。
三層スキーマはその「スキーマ」を3階層に分けて定義する考え方です。

  • 外部スキーマ … ユーザからみたデータの定義。ビュー等。
  • 概念スキーマ … テーブルを作成するための定義。
  • 内部スキーマ … 物理的なデータの定義。(実際にデータベースのデータはファイルで管理されるため、物理的なデータ=ファイルについての定義)

データベース個々で使われる「スキーマ」

PosgresSQL

PostgresSQLにおけるスキーマはデータベースに作成されるテーブルや関数といったオブジェクトをグループ化するものです。

  • データベースを作成すると、デフォルトでpublicという特別なスキーマが作成される
  • public以外にも任意な名前でスキーマを作成できる
  • テーブル作成時にスキーマを指定しない場合はpublicスキーマに作成される
  • スキーマには、テーブル以外にデータ型、関数および演算子などの他の名前付きオブジェクトも含まれる
  • ユーザは、デフォルトでは所有していないスキーマのオブジェクトをアクセスすることはできないため、そのスキーマの所有者からスキーマのUSAGE権限を付与してもらう必要がある

PosgresSQL参考1
PosgresSQL参考2

OracleDB

OracleDBにおけるスキーマはユーザが所有するオブジェクトの論理集合、とのことです。
スキーマを使うことで「1 つのデータベースを多数のユーザが互いに干渉することなく使用できる」「ユーザにスキーマへのアクセス権限を与えることで、セキュリティを高める」のメリットがあります。

  • 作成されたユーザは、自身と同じ名前の単一スキーマを所有する
  • ユーザは複数のスキーマを所有できないため、ユーザ=スキーマの理解で問題ない
  • スキーマ内のオブジェクトをスキーマオブジェクトと呼び、表(テーブル)/索引(インデックス)/ビュー/順序(シーケンス)/ストアド・プログラムがそれに該当する
  • 自身のスキーマ以外にはデフォルトでアクセスすることはできないため、そのスキーマの所有者からスキーマのSELECT権限やUPDAT権限を付与してもらう必要がある

OracleDB参考1

MySQL

MySQLにおけるスキーマは「1つのDB=1つのスキーマ」の理解でよさそうです。
(DB=スキーマなら「スキーマ」の言葉必要ないよね?と思いましたが、どのサイトにも、「DBとスキーマはほぼほぼ等しいです」みたいなことしか書いてなかった。。。)

MySQL参考1

SQL Server

SQL Serverでのスキーマとは簡単に言い換えるとデータベースにおける名前付きコンテナ。…らしいです。
私はこの言葉の意味をきちんと理解することができませんでした(^^;)ただ、使い方などを調べてPostgreSQLやOracleDBとほぼほぼ同じかなと私は思います。

  • 新しく作成されたデータベースに使用される既定のスキーマは「dbo」
  • データベースに複数のスキーマを作成することができる
  • スキーマを作成する際に、所有者(ユーザ)を指定する。スキーマ名は所有者と同じにするのが一般的。

SQL Server参考1
SQL Server参考2

最後に

データベースについて仕組みや概念など深く理解しなくても、アプリケーション開発って出来ちゃいますよね。
今回調べてみて、もっとデータベースについて深く理解する必要があると思いました。精進します。

4
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?