記事を書いた経緯
これまで色々なDBを利用し開発を行ってきましたが、「スキーマ」の言葉がよく出てきました。
出てくる度に、調べてはなんとなーく理解して、を繰り返し結局毎回頭に残らないので、記事に残すことにしました。
「スキーマ」とは
まず、データベースに限らない広い意味での「スキーマ」という言葉の意味は、「おおまかな概念(状態)や構造」と理解しました。
wikipediaによると
スキーマとは、もともと図や図式や計画のことを指す言葉で、今では様々な分野で広く用いられる言葉。「スキーム」と「スキーマ」はほぼ同じ意味であるが、一般にスキームが具体的にほとんど完成された計画や図を意味するのに比べて、スキーマはその手前のおおまかな(概念)状態を指すことが多い。
データベースの概念的な意味で使われる「スキーマ」とデータベース個々で使われる「スキーマ」は別
OracleDBを利用したシステムの開発時に、同じデータベース内に同名のテーブルを2つ作成し、WEBアプリからとバッチからで参照先を変えたい事象が発生しました。
「スキーマ分けたら大丈夫だから」と上司に言われ、スキーマってなんだっけ?どう使うんだっけ?と思い【スキーマ データベース】で調べました。
するとでてきたのは「三層スキーマ」等の概念的な言葉で、なんか知りたいのと違う・・使い方が書いてない・・もやもや。という状態に。
データベースの概念的な「スキーマ」と、個々のデータベースでの「スキーマ」は別だと認識して調べた方が良さそうです。
上記のように、開発でスキーマを利用する必要がある場合は【スキーマ データベース】ではなく【スキーマ OracleDB】のように、データベース名を指定して調べるべきでしたね。
データベースの概念的な意味で使われる「スキーマ」
データベースの概念的な意味で使われる「スキーマ」はデータベースの構造のことであり、設計時に利用される言葉かなと思います。
三層スキーマはその「スキーマ」を3階層に分けて定義する考え方です。
- 外部スキーマ … ユーザからみたデータの定義。ビュー等。
- 概念スキーマ … テーブルを作成するための定義。
- 内部スキーマ … 物理的なデータの定義。(実際にデータベースのデータはファイルで管理されるため、物理的なデータ=ファイルについての定義)
データベース個々で使われる「スキーマ」
PosgresSQL
PostgresSQLにおけるスキーマはデータベースに作成されるテーブルや関数といったオブジェクトをグループ化するものです。
- データベースを作成すると、デフォルトでpublicという特別なスキーマが作成される
- public以外にも任意な名前でスキーマを作成できる
- テーブル作成時にスキーマを指定しない場合はpublicスキーマに作成される
- スキーマには、テーブル以外にデータ型、関数および演算子などの他の名前付きオブジェクトも含まれる
- ユーザは、デフォルトでは所有していないスキーマのオブジェクトをアクセスすることはできないため、そのスキーマの所有者からスキーマのUSAGE権限を付与してもらう必要がある
OracleDB
OracleDBにおけるスキーマはユーザが所有するオブジェクトの論理集合、とのことです。
スキーマを使うことで「1 つのデータベースを多数のユーザが互いに干渉することなく使用できる」「ユーザにスキーマへのアクセス権限を与えることで、セキュリティを高める」のメリットがあります。
- 作成されたユーザは、自身と同じ名前の単一スキーマを所有する
- ユーザは複数のスキーマを所有できないため、ユーザ=スキーマの理解で問題ない
- スキーマ内のオブジェクトをスキーマオブジェクトと呼び、表(テーブル)/索引(インデックス)/ビュー/順序(シーケンス)/ストアド・プログラムがそれに該当する
- 自身のスキーマ以外にはデフォルトでアクセスすることはできないため、そのスキーマの所有者からスキーマのSELECT権限やUPDAT権限を付与してもらう必要がある
MySQL
MySQLにおけるスキーマは「1つのDB=1つのスキーマ」の理解でよさそうです。
(DB=スキーマなら「スキーマ」の言葉必要ないよね?と思いましたが、どのサイトにも、「DBとスキーマはほぼほぼ等しいです」みたいなことしか書いてなかった。。。)
SQL Server
SQL Serverでのスキーマとは簡単に言い換えるとデータベースにおける名前付きコンテナ。…らしいです。
私はこの言葉の意味をきちんと理解することができませんでした(^^;)ただ、使い方などを調べてPostgreSQLやOracleDBとほぼほぼ同じかなと私は思います。
- 新しく作成されたデータベースに使用される既定のスキーマは「dbo」
- データベースに複数のスキーマを作成することができる
- スキーマを作成する際に、所有者(ユーザ)を指定する。スキーマ名は所有者と同じにするのが一般的。
最後に
データベースについて仕組みや概念など深く理解しなくても、アプリケーション開発って出来ちゃいますよね。
今回調べてみて、もっとデータベースについて深く理解する必要があると思いました。精進します。