導入
小さな学習用 DB ならテーブルは数個ですが、実務の DB には数百のテーブルが入ることも珍しくありません。全部が同じ場所に並んでいたら、どれが何のためのテーブルか分からなくなります。そこで、テーブルを用途や担当ごとにグループ分けする仕組みが スキーマ(Schema) です。パソコンでファイルをフォルダに分けて整理するのに似ています。
説明
大きな DB(PostgreSQL / Oracle / MySQL など)では、1つの DB の中に複数のスキーマ(名前空間)を作れます。たとえば「販売(sales)」と「人事(hr)」でスキーマを分け、同じ orders という名前でも、別スキーマにあれば別物として共存できます。
flowchart TD
DB[("データベース company_db")]
DB --> S1["スキーマ sales<br/>販売部門のテーブル群"]
DB --> S2["スキーマ hr<br/>人事部門のテーブル群"]
S1 --> T1["sales.orders"]
S1 --> T2["sales.customers"]
S2 --> T3["hr.employees"]
S2 --> T4["hr.salaries"]
スキーマの中のテーブルは「スキーマ名.テーブル名」で指定します(SELECT * FROM sales.orders;)。スキーマを分ける利点は3つ。整理(どの業務のテーブルか名前で分かる)・権限管理(スキーマ単位でまとめてアクセス制御)・名前の衝突回避(別スキーマなら同名を使える)です。
SQLite にはこの「スキーマで区切る」機能はありません(テーブルはすべて1つの場所に並びます)。ただし SQLite にも、DB 自身の構造を記録した特別な表 sqlite_master(別名 sqlite_schema)があります。ここを見ると、今あるテーブル・ビュー・トリガー・インデックスの一覧が分かります。「データベースが自分の設計図を持っている」という感覚をつかむために、覗いてみましょう。
SELECT name, type FROM sqlite_master
WHERE type IN ('table', 'view', 'trigger', 'index');
やってみよう
初期表示のクエリを実行して、いま shop データベースにどんなテーブル・索引があるかを見てみましょう。もし前のレッスンでビューやトリガー、第4章で索引を作った直後なら、それらも view / trigger / index として一覧に出ます(「DBを初期状態に戻す」で消えます)。この一覧が、SQLite にとっての「スキーマ(設計図)」の中身です。
演習
sqlite_master から、種類が table のものだけの名前を取り出してください。
ヒント1を見る
SELECT name FROM sqlite_master WHERE type = 'table'; の形です。
ヒント2を見る
SELECT name FROM sqlite_master WHERE type = 'table';