スキーマとは?データベース(DB)の豊富な実例を交えて初心者向けに解説

データベースの学習者や、データベースを業務で活用する際には、「スキーマ」の理解が欠かせません。

スキーマは特にリレーショナルデータベースの根幹を成す概念であり、データベース内のデータを整理し、適切な形で利用可能にする役割を果たします。

この記事では、スキーマの基本的な概念から、その種類と利用シーン、そしてOracle・PostgreSQL・MySQL視点のスキーマについて、具体的な実例を用いて解説します。

スキーマとは(DB)

この章では、主にデータベースの分野で使われるスキーマについて、その定義やデータベースとの関連性、利用シーンなどについて説明します。

スキーマの定義とデータベース(DB)との関連性

スキーマとは、データベースの構造を定義するためのフレームワークです。具体的には、テーブルの作成、各テーブルに格納するフィールド(列)の定義、フィールドのデータ型、制約、それらの間のリレーションシップ(関連性)などを決定します。

たとえば、以下のSQLは「Customers」という名前のテーブルを作成するコードです。それぞれ「CustomerID」「CustomerName」「ContactName」「Country」という名前のフィールドが定義され、それぞれが整数型(int)や文字列型(varchar)などのデータ型を持つことが示されています。

また、「CustomerID」は主キー(PRIMARY KEY)として指定され、NULL値が許されていません(NOT NULL)。

CREATE TABLE Customers (
    CustomerID int NOT NULL,
    CustomerName varchar(255) NOT NULL,
    ContactName varchar(255),
    Country varchar(255),
    PRIMARY KEY (CustomerID)
);

このSQLコードにより作成されるテーブルは以下のような形になります。

CustomerIDCustomerNameContactNameCountry
整数型(int)
NULLは非許容
文字列型(varchar)
255バイトまで
文字列型(varchar)
255バイトまで
文字列型(varchar)
255バイトまで

このようにテーブルのフィールド(列)に格納するデータを定義する概念がスキーマです。上記のテーブルでは、「CustomerID」の列は数値型のみ格納が可能で、空白は許容されなくなります。

データベースは、テーブルをスキーマで定義することによって、データの一貫性や整合性が保たれているのです。

Excelの入力規則

スキーマの概念は、エクセルの「入力規則」に似ています。

エクセルで特定のセルに数値のみを入力させるための規則を設定することができますよね。それと同様に、スキーマでは各フィールドにどのようなデータが格納されるべきかを定義することができます。

このような規則性があるために、データベースは大量のデータを効率的に扱うことが可能となります。

スキーマの役割と利用シーン

スキーマは主に下記のシーンで利用されます。

1.データベースの設計

データベースの設計段階で最初に行う作業の1つがスキーマの設計です。データベースの全体像を定義するスキーマが存在することで、データの整理、管理、検索が効率的に行われ、データベースの全体像が形成されます。

2.データベースの拡張や改修

既存のデータベースを拡張する際や、新しい機能を追加する際にはスキーマの更新が必要となります。スキーマを更新することで、新たに追加されるデータが正しく格納・管理されます。

3.データベースのパフォーマンス向上

適切に設計されたスキーマはデータベースのパフォーマンスを向上させます。たとえば、適切なインデックスを設定することで、データの検索速度を高めることができます。


これらのシーンを通じて、スキーマはデータベースの効率的な運用に貢献します。

スキーマの重要性

データベースを効率的に運用するためには、スキーマの重要性を理解することが欠かせません。ここでは、スキーマがデータベースの整理と管理、そしてパフォーマンス向上にどのように関わっているのかを解説します。

データ整理と管理の観点からの重要性

スキーマはデータの構造を定義します。これにより、データが一貫性と整合性をもって管理されます。

たとえば、特定のフィールドには特定のデータ型のみが入力できるように定義することが可能です。これにより、そのフィールドに文字列が入力されることを防ぐことができます。

さらに、スキーマはデータの整理にも有効です。たとえば、下記のようなスキーマがあるとします。

CustomerIDCustomerNameContactNameCountry
整数型(int)
NOT NULL
文字列型(varchar)
255バイトまで
NOT NULL
文字列型(varchar)
255バイトまで
文字列型(varchar)
255バイトまで

このスキーマにより、「CustomerName」フィールドには顧客の名前が入力されるという保証が強まります。このようにスキーマを用いることで、どのデータがどのフィールドに入力されるのかを一貫して管理することが可能となります。

データベースパフォーマンス向上への貢献

スキーマは、データベースのパフォーマンス向上にも影響します。データベースはスキーマの定義に従ってデータを保存、管理します。そのため、スキーマの設計が適切であればあるほど、データベースのパフォーマンスは向上するのです。

例を挙げましょう。

「データの正規化」というプロセスは、データベース内のデータの重複を最小限にするものです。これにより、データの保存や検索、更新のパフォーマンスが向上します。

たとえば、1つのデータベース内に顧客の名前が複数のテーブルに格納されていると、その情報が更新された際に全てのテーブルを正確に更新することが困難となり、データの一貫性が損なわれる可能性があります。

これを避けるために、スキーマでは各顧客に一意の識別子(PrimaryKey)を割り当て、その識別子を通じて顧客情報を参照するように設計します。これにより、情報が一箇所にまとめられ、データの重複が最小限に抑えられるのです。また、データの検索や更新も効率的に行えるため、パフォーマンスも向上します。

たとえば、次のようなテーブル設計で考えてみましょう。

CustomerID (PrimaryKey)CustomerNameContactNameCountry
1TanakaTanaka TaroJapan
2SmithJohn SmithUSA
3LiLi WangChina

ここでは、CustomerIDがPrimaryKeyとして設定されており、各行(各顧客)を一意に識別しています。このPrimaryKeyを使って他のテーブルから情報を参照することで、データの整合性と一貫性が保たれ、パフォーマンスが向上するのです。

以上のように、スキーマはデータベースのデータ整理と管理、パフォーマンス向上において重要な役割を果たします。

スキーマの種類と特性

この章では、スキーマの種類とそれぞれの特性について説明します。

リレーショナルスキーマ

リレーショナルスキーマは、リレーショナルデータベース管理システム(RDBMS)におけるデータ構造の表現形式の1つです。このスキーマは、データベース内のテーブル、それらのテーブルの間の関連性、各テーブル内の行と列の定義などを指定します。

たとえば、以下のリレーショナルスキーマは、”Customers”というテーブルと、”Orders”というテーブルを定義しています。また、それぞれのテーブル内での列(フィールド)の定義、そして両テーブルの間のリレーションシップ(つまり、どの列がどの列に対応するか)も定義しています。

CREATE TABLE Customers (
    CustomerID int,
    CustomerName varchar(255),
    ContactName varchar(255),
    Country varchar(255),
    PRIMARY KEY (CustomerID)
);

CREATE TABLE Orders (
    OrderID int,
    CustomerID int,
    OrderDate date,
    PRIMARY KEY (OrderID),
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
CustomerIDCustomerNameContactNameCountry
1TanakaTanaka TaroJapan
2SmithJohn SmithUSA
3LiLi WangChina
CustomerIDテーブル
OrderIDCustomerIDOrderDate
001320230601
002120230607
Orderテーブル

作成されたテーブルは、Orderテーブルの「CustomerID」に格納されている値(3や1)が、CustomrerIDテーブルの「CustomerID」と関連していることがイメージできるかと思います。

データスキーマ

データスキーマは、データの整理、管理、およびデータベースの構造を定義するための設計図です。データスキーマは、データベースに格納されるデータの詳細な形式、データの属性、データ間のリレーションシップを定義します。

具体的には、データスキーマは以下の要素を含みます。

  • データベースに含まれるテーブルとそのフィールド(列)
  • 各フィールドのデータ型(例:整数、文字列、日付など)
  • 各テーブル内の主キーと外部キー
  • テーブル間のリレーションシップ(例:一対多、多対多など)


データスキーマはリレーショナルスキーマと同様に、SQLを用いて定義されます。データスキーマはテーブルのデザインとデータの一貫性を保つことに有効です。

データベースの性能や利便性を向上させるために、データスキーマの適切な設計が必要です。

Oracleのスキーマ

Oracleデータベースでは、スキーマはユーザーアカウントに直結し、特定のユーザーが所有するデータベースオブジェクトの集合体を表します。これらのオブジェクトにはテーブル、ビュー、インデックス、ストアドプロシージャなどが含まれます。

Oracleスキーマの特性と利点

Oracleスキーマの主な特性を紹介します。

所有権とセキュリティ: Oracleのスキーマは特定のユーザーアカウントに紐づいています。このため、スキーマの所有者(ユーザー)だけがスキーマ内のオブジェクトを管理(作成、変更、削除)できます。これにより、データのセキュリティが向上します。

名前空間: スキーマは、名前空間として機能します。つまり、同じスキーマ内に同じ名前のオブジェクトを複数作成することはできません。これはデータの整合性を保つための重要な機能です。

オブジェクト管理の柔軟性: スキーマを通じて、一連の関連するデータベースオブジェクトをまとめて管理することが可能です。これにより、データの整理と管理が容易になります。

Oracleスキーマの具体的な利用方法

Oracleスキーマの作成は、新しいユーザーアカウントを作成することで行われます。下記で、新しいユーザーアカウント(スキーマ)の作成例を紹介します。

CREATE USER my_schema IDENTIFIED BY my_password;
GRANT CONNECT, RESOURCE TO my_schema;

ここで、my_schemaは新しく作成するスキーマ(ユーザーアカウント)の名前で、my_passwordはそのパスワードです。GRANT文はmy_schemaに必要な権限を付与しています。

このようにして作成されたスキーマは、その所有者がデータベースオブジェクト(テーブルやビューなど)を作成するための「場所」となります。例えば、次のようにmy_schemaスキーマで新しいテーブルを作成することが可能です。

CREATE TABLE my_schema.my_table (
  id NUMBER PRIMARY KEY,
  name VARCHAR2(100)
);

ここで、my_schema.my_tablemy_schemaスキーマに作成する新しいテーブルの名前です。このようにスキーマを活用すれば、データベースオブジェクトを整理し、データの一貫性とセキュリティを保つことが可能になります。

PostgreSQLのスキーマ

PostgreSQLデータベースでは、スキーマはデータベースオブジェクトの名前空間を表します。つまり、同じデータベース内で同じ名前のオブジェクトがある場合でも、それぞれが異なるスキーマに属していれば区別することができます。

スキーマはテーブル、ビュー、インデックス、シーケンス、データ型、関数、演算子などのオブジェクトを含むことができます。

PostgreSQLスキーマの特性と利点

PostgreSQLスキーマの主な特性を紹介します。

名前空間: PostgreSQLのスキーマはデータベースオブジェクトの名前空間を提供します。これにより、同じデータベース内でも異なるスキーマに属するオブジェクトを同じ名前で作成することが可能になります。

セキュリティ: PostgreSQLのスキーマはオブジェクトのセキュリティも提供します。スキーマの所有者や特定の役割に対して、スキーマ内のオブジェクトへのアクセス権を制御することが可能です。加えて、PostgreSQLでは、ロールベースのアクセス制御(RBAC)が提供され、セキュリティ管理をより細かく柔軟に行うことができます。

データの整理: PostgreSQLのスキーマを使用すると、関連するデータベースオブジェクトをまとめることができます。このため、データベースの管理が容易になり、同じ名前のオブジェクトを異なるスキーマ内に作成することが可能です。これにより、大規模なデータベース環境でもデータの整理と管理が容易になります。

PostgreSQLスキーマの具体的な利用方法

新しいスキーマを作成するには、次のSQLコマンドを使用します。

SQLCopy codeCREATE SCHEMA my_schema;

ここでmy_schemaは新しく作成するスキーマの名前です。このスキーマ内に新しいテーブルを作成するには次のようにします。

SQLCopy codeCREATE TABLE my_schema.my_table (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100)
);

ここで、my_schema.my_tablemy_schemaスキーマに作成する新しいテーブルの名前です。このようにスキーマを活用すれば、データベースオブジェクトを整理し、データの一貫性とセキュリティを保つことが可能になります。

MySQLのスキーマ

MySQLでは、「データベース」と「スキーマ」は同義語として使用されます。つまり、MySQLにおけるスキーマはデータベースそのものを指します。そのため、スキーマ(データベース)内にはテーブル、ビュー、トリガー、ストアドプロシージャなどのデータベースオブジェクトが格納されます。

MySQLスキーマの特性と利点

MySQLのスキーマの主な特性を紹介します。

名前空間: MySQLのスキーマはデータベース全体の名前空間を提供します。これにより、異なるスキーマ(データベース)では同じ名前のオブジェクトを作成できますが、同じスキーマ内には同じ名前のオブジェクトを作成することはできません。

セキュリティ: MySQLのスキーマはオブジェクトのセキュリティも提供します。スキーマの所有者や特定のユーザーに対して、スキーマ内のオブジェクトへのアクセス権を制御することが可能です。また、MySQLでは、各ユーザーに対して、スキーマ内の特定のオブジェクトに対する特権(SELECT、INSERT、UPDATE、DELETEなど)を個別に付与または剥奪することができます。

データの整理: MySQLのスキーマを使用すると、関連するデータベースオブジェクトをまとめることができます。スキーマ内には同じ名前のオブジェクトを作成することはできませんが、異なるスキーマでは同じ名前のオブジェクトを作成できます。これにより、データの整理と管理が容易になります。

MySQLスキーマの具体的な利用方法

新しいスキーマ(データベース)を作成するには、次のSQLコマンドを使用します。

SQLCopy codeCREATE DATABASE my_schema;

ここでmy_schemaは新しく作成するスキーマ(データベース)の名前です。このスキーマ内に新しいテーブルを作成するには、まずスキーマを選択(USE)してからテーブルを作成します。

SQLCopy codeUSE my_schema;
CREATE TABLE my_table (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100)
);

ここで、my_tablemy_schemaスキーマ(データベース)に作成する新しいテーブルの名前です。このようにスキーマを活用すれば、データベースオブジェクトを整理し、データの一貫性とセキュリティを保つことが可能になります。

あとがき

この記事では、「データベーススキーマ」の基本的な概念、特性、さらには具体的な活用方法まで、初心者向けに幅広く解説しました。スキーマの理解は、現代のデータ管理、特にデータベース設計を深く理解し、効果的に活用するために不可欠です。

データベーススキーマは、データの整理、管理の効率化、そしてデータベースパフォーマンスの向上を実現する重要な手段です。特に、データベースが大規模で複雑な場合や、新しいデータの追加や変更に対応する柔軟性が求められる場合に、このスキーマの真価が発揮されます。

当サイトでは、今回紹介した「データベーススキーマ」以外でもデータベースに関する網羅的な情報を引き続き発信していきますので、またご覧頂けると幸いです。

Analytics沖縄

データサイエンス・機械学習・ディープラーニングを本格的に研究するフリーランスエンジニア。 「Google データアナリティクス プロフェッショナル」の認定証を取得済み。 この分野は専門知識がなければ理解し辛い情報が多いのですが、当サイトでは初学者も意識して発信していきますので、ご関心があればぜひご覧ください。

Recent Posts

SQLの種類|DDL、DML、DCL(命令言語の分類)

今回は、データベースに対する命…

4か月 ago

SQL|FROM句の使い方。基本構文とテーブル指定の実例

今回は、SQLの基本かつ使用頻…

4か月 ago

MySQLの日付型や時刻型で使う関数のフォーマット指定子

今回は、MySQLの日付型や時…

8か月 ago

SQL│文字列を日付型に変換するTo_Date・Convert

今回は、SQLで文字列を日付型…

9か月 ago