DB→わかる。Table→わかる。Schema→お前は一体なんなんだ・・・!

全般

記事作成から1年以上経過しています。
内容が古い可能性があります。

publicスキーマってなんじゃ!!!

TL;DR(要約すると・・・)

  1. MySQLではデータベースとスキーマは同じと思って大丈夫。
  2. PostgreSQLではデータベースがあってその下にスキーマが存在する。
  3. デフォルトでは public スキーマが作成される。

これまでの経緯

とある日の昼下がり

BOSS: ちょっと悪いんだけどさ、検証用のPostgreSQLにdevelopスキーマ追加してもらえないかな?

私: developスキーマですね、いいっすよ。

私 : (ユーザ作って、DB作って、権限付与してと…)

私: BOSS!developスキーマできました!

BOSS: ありがとう!

BOSS: ・・・ん? これpublicに繋げばいいの?

私: ・・・ん? public? ほんとだ!publicスキーマってなんじゃ!!!

というわけで、今回は MySQL と PostgreSQL のスキーマについて確認しましょう。

必要なもの

Docker上に MySQL と PostgreSQL を構築し確認していきますが、
ローカル環境でも問題無いです。
また、データベースの操作はA5 SQL Mk-2を使用します。

  • 必須
    • MySQL:8.0
    • PostgreSQL:12.3
  • 任意
    • Docker, Docker Compose
    • A5 SQL Mk-2
    • Sublime Text

MySQLで確認

DockerComposeでMySQLを起動して、

version: '3'

services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: 'Asia/Tokyo'
    ports:
    - "3306:3306"

A5M2 で接続して、

developデータベースとテーブルを作成して、

/* データベースの作成 */
CREATE DATABASE develop;

/* テーブルの作成 */
CREATE TABLE develop.schema_info (
    id int,
    name varchar(255)
);

/* 適当にデータを insert */
INSERT INTO develop.schema_info values(1, 'MySQL.develop');

一度接続を閉じてDBの内容をA5M2で確認してみる。

RDBMS(local_mysql) > Database(develop) > Table(schema_info) の構成なので、データベースとスキーマは同じという認識でも問題なさそう。

次は、PostgreSQLを確認してみます。

PostgreSQLで確認

MySQLと同様に確認します。
※ PostgreSQL:12.3 だと A5M2 のバージョンによってはエラーが出るので要注意!詳細は下部のおまけにて

DockerComposeで PostgreSQL を起動して、

version: '3'

services:
  postgres:
    image: postgres:11.8
    environment:
      POSTGRES_PASSWORD: postgres
    ports:
      - "5432:5432"

A5M2 で接続して、

developデータベースとテーブルを作成して、

/* データベースの作成 */
CREATE DATABASE develop;

/* テーブルの作成 */
CREATE TABLE schema_info (
    id integer,
    name varchar(255)
);

/* 適当にデータを insert */
INSERT INTO schema_info values(2, 'PostgreSQL.develop');

一度接続を閉じてDBの内容を確認してみる。

いつの間にか public がいた! そして develop がいない!!

developに接続できるようにDB設定を修正してテーブルを作り直す

Database(local_postgres.develop) > schema(public) > Table(schema_info) の構成なので、MySQLとは異なりデータベースとテーブルの間にスキーマが挟まっていることが確認できた。

エピローグ

私: BOSS!! スキーマの概念について私が間違っておりました!接続手順書もつけるので許してください!

BOSS: うむ!! 手順書ありがとう!助かります!

みんな開発に着手できましたとさ、めでたしめでたし。

おまけ

PostgreSQL:12.3 に A5M2:2.14.1 で接続すると

が出てくる。

ポスグレ内の構成が変わったことが原因みたい。
トピック: 【不具合報告】接続エラー |

コメント