データベースの学習者や、データベースを業務で活用する際には、「スキーマ」の理解が欠かせません。
スキーマは特にリレーショナルデータベースの根幹を成す概念であり、データベース内のデータを整理し、適切な形で利用可能にする役割を果たします。
この記事では、スキーマの基本的な概念から、その種類と利用シーン、そしてOracle・PostgreSQL・MySQL視点のスキーマについて、具体的な実例を用いて解説します。
この章では、主にデータベースの分野で使われるスキーマについて、その定義やデータベースとの関連性、利用シーンなどについて説明します。
スキーマとは、データベースの構造を定義するためのフレームワークです。具体的には、テーブルの作成、各テーブルに格納するフィールド(列)の定義、フィールドのデータ型、制約、それらの間のリレーションシップ(関連性)などを決定します。
たとえば、以下の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コードにより作成されるテーブルは以下のような形になります。
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
整数型(int) NULLは非許容 | 文字列型(varchar) 255バイトまで | 文字列型(varchar) 255バイトまで | 文字列型(varchar) 255バイトまで |
このようにテーブルのフィールド(列)に格納するデータを定義する概念がスキーマです。上記のテーブルでは、「CustomerID」の列は数値型のみ格納が可能で、空白は許容されなくなります。
データベースは、テーブルをスキーマで定義することによって、データの一貫性や整合性が保たれているのです。
スキーマの概念は、エクセルの「入力規則」に似ています。
エクセルで特定のセルに数値のみを入力させるための規則を設定することができますよね。それと同様に、スキーマでは各フィールドにどのようなデータが格納されるべきかを定義することができます。
このような規則性があるために、データベースは大量のデータを効率的に扱うことが可能となります。
スキーマは主に下記のシーンで利用されます。
データベースの設計段階で最初に行う作業の1つがスキーマの設計です。データベースの全体像を定義するスキーマが存在することで、データの整理、管理、検索が効率的に行われ、データベースの全体像が形成されます。
既存のデータベースを拡張する際や、新しい機能を追加する際にはスキーマの更新が必要となります。スキーマを更新することで、新たに追加されるデータが正しく格納・管理されます。
適切に設計されたスキーマはデータベースのパフォーマンスを向上させます。たとえば、適切なインデックスを設定することで、データの検索速度を高めることができます。
これらのシーンを通じて、スキーマはデータベースの効率的な運用に貢献します。
データベースを効率的に運用するためには、スキーマの重要性を理解することが欠かせません。ここでは、スキーマがデータベースの整理と管理、そしてパフォーマンス向上にどのように関わっているのかを解説します。
スキーマはデータの構造を定義します。これにより、データが一貫性と整合性をもって管理されます。
たとえば、特定のフィールドには特定のデータ型のみが入力できるように定義することが可能です。これにより、そのフィールドに文字列が入力されることを防ぐことができます。
さらに、スキーマはデータの整理にも有効です。たとえば、下記のようなスキーマがあるとします。
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
整数型(int) NOT NULL | 文字列型(varchar) 255バイトまで NOT NULL | 文字列型(varchar) 255バイトまで | 文字列型(varchar) 255バイトまで |
このスキーマにより、「CustomerName」フィールドには顧客の名前が入力されるという保証が強まります。このようにスキーマを用いることで、どのデータがどのフィールドに入力されるのかを一貫して管理することが可能となります。
スキーマは、データベースのパフォーマンス向上にも影響します。データベースはスキーマの定義に従ってデータを保存、管理します。そのため、スキーマの設計が適切であればあるほど、データベースのパフォーマンスは向上するのです。
例を挙げましょう。
「データの正規化」というプロセスは、データベース内のデータの重複を最小限にするものです。これにより、データの保存や検索、更新のパフォーマンスが向上します。
たとえば、1つのデータベース内に顧客の名前が複数のテーブルに格納されていると、その情報が更新された際に全てのテーブルを正確に更新することが困難となり、データの一貫性が損なわれる可能性があります。
これを避けるために、スキーマでは各顧客に一意の識別子(PrimaryKey)を割り当て、その識別子を通じて顧客情報を参照するように設計します。これにより、情報が一箇所にまとめられ、データの重複が最小限に抑えられるのです。また、データの検索や更新も効率的に行えるため、パフォーマンスも向上します。
たとえば、次のようなテーブル設計で考えてみましょう。
CustomerID (PrimaryKey) | CustomerName | ContactName | Country |
---|---|---|---|
1 | Tanaka | Tanaka Taro | Japan |
2 | Smith | John Smith | USA |
3 | Li | Li Wang | China |
ここでは、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)
);
CustomerID | CustomerName | ContactName | Country |
---|---|---|---|
1 | Tanaka | Tanaka Taro | Japan |
2 | Smith | John Smith | USA |
3 | Li | Li Wang | China |
OrderID | CustomerID | OrderDate |
---|---|---|
001 | 3 | 20230601 |
002 | 1 | 20230607 |
作成されたテーブルは、Orderテーブルの「CustomerID」に格納されている値(3や1)が、CustomrerIDテーブルの「CustomerID」と関連していることがイメージできるかと思います。
データスキーマは、データの整理、管理、およびデータベースの構造を定義するための設計図です。データスキーマは、データベースに格納されるデータの詳細な形式、データの属性、データ間のリレーションシップを定義します。
具体的には、データスキーマは以下の要素を含みます。
データスキーマはリレーショナルスキーマと同様に、SQLを用いて定義されます。データスキーマはテーブルのデザインとデータの一貫性を保つことに有効です。
データベースの性能や利便性を向上させるために、データスキーマの適切な設計が必要です。
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_table
はmy_schema
スキーマに作成する新しいテーブルの名前です。このようにスキーマを活用すれば、データベースオブジェクトを整理し、データの一貫性とセキュリティを保つことが可能になります。
PostgreSQLデータベースでは、スキーマはデータベースオブジェクトの名前空間を表します。つまり、同じデータベース内で同じ名前のオブジェクトがある場合でも、それぞれが異なるスキーマに属していれば区別することができます。
スキーマはテーブル、ビュー、インデックス、シーケンス、データ型、関数、演算子などのオブジェクトを含むことができます。
PostgreSQLスキーマの主な特性を紹介します。
名前空間: PostgreSQLのスキーマはデータベースオブジェクトの名前空間を提供します。これにより、同じデータベース内でも異なるスキーマに属するオブジェクトを同じ名前で作成することが可能になります。
セキュリティ: PostgreSQLのスキーマはオブジェクトのセキュリティも提供します。スキーマの所有者や特定の役割に対して、スキーマ内のオブジェクトへのアクセス権を制御することが可能です。加えて、PostgreSQLでは、ロールベースのアクセス制御(RBAC)が提供され、セキュリティ管理をより細かく柔軟に行うことができます。
データの整理: 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_table
はmy_schema
スキーマに作成する新しいテーブルの名前です。このようにスキーマを活用すれば、データベースオブジェクトを整理し、データの一貫性とセキュリティを保つことが可能になります。
MySQLでは、「データベース」と「スキーマ」は同義語として使用されます。つまり、MySQLにおけるスキーマはデータベースそのものを指します。そのため、スキーマ(データベース)内にはテーブル、ビュー、トリガー、ストアドプロシージャなどのデータベースオブジェクトが格納されます。
MySQLのスキーマの主な特性を紹介します。
名前空間: MySQLのスキーマはデータベース全体の名前空間を提供します。これにより、異なるスキーマ(データベース)では同じ名前のオブジェクトを作成できますが、同じスキーマ内には同じ名前のオブジェクトを作成することはできません。
セキュリティ: MySQLのスキーマはオブジェクトのセキュリティも提供します。スキーマの所有者や特定のユーザーに対して、スキーマ内のオブジェクトへのアクセス権を制御することが可能です。また、MySQLでは、各ユーザーに対して、スキーマ内の特定のオブジェクトに対する特権(SELECT、INSERT、UPDATE、DELETEなど)を個別に付与または剥奪することができます。
データの整理: 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_table
はmy_schema
スキーマ(データベース)に作成する新しいテーブルの名前です。このようにスキーマを活用すれば、データベースオブジェクトを整理し、データの一貫性とセキュリティを保つことが可能になります。
この記事では、「データベーススキーマ」の基本的な概念、特性、さらには具体的な活用方法まで、初心者向けに幅広く解説しました。スキーマの理解は、現代のデータ管理、特にデータベース設計を深く理解し、効果的に活用するために不可欠です。
データベーススキーマは、データの整理、管理の効率化、そしてデータベースパフォーマンスの向上を実現する重要な手段です。特に、データベースが大規模で複雑な場合や、新しいデータの追加や変更に対応する柔軟性が求められる場合に、このスキーマの真価が発揮されます。
当サイトでは、今回紹介した「データベーススキーマ」以外でもデータベースに関する網羅的な情報を引き続き発信していきますので、またご覧頂けると幸いです。