メインコンテンツへスキップ

3.5.2 リレーショナルデータベースの基礎

リレーショナルデータベースの基礎図

選択章

この章は選択内容です。データ分析やモデリングだけをしたいなら、いったん飛ばしてもかまいません。ですが、将来 AI アプリ開発(たとえば RAG システム、AI Agent)をするなら、データベースの知識は必須です。

学習目標

  • データベースとは何か、なぜ必要なのかを理解する
  • リレーショナルデータベースの基本概念を身につける
  • テーブル、行、列、主キー、外部キーの意味を理解する
  • よく使われるデータベース管理システムを知る

なぜ AI エンジニアはデータベースを学ぶ必要があるのか?

「もう Pandas で CSV を読めるのに、どうしてデータベースまで学ぶ必要があるの?」と思うかもしれません。

シーンCSV ファイルデータベース
データ量数万行なら大丈夫、百万行だと重くなる数億行でも軽く処理できる
複数人での協力どこを誰が変えたか分かりにくく、競合しやすい同時読み書きに対応し、権限管理もできる
データの安全性ファイルを消したらなくなるバックアップ、トランザクション、障害復旧がある
検索速度毎回全体を走査する必要があるインデックスがあり、ミリ秒単位で検索できる
データの関連付け複数ファイルを手作業で merge するSQL JOIN ひとつで解決できる

実際の場面の例:

  • RAG システムを作る → ユーザーの質問と回答の履歴をデータベースに保存する
  • AI Agent を作る → メモリシステムには永続的な保存が必要
  • レコメンドシステムを作る → ユーザー行動データはデータベースにある
  • データ分析をする → 企業データの 99% はデータベースに保存されている

リレーショナルデータベースとは?

Excel にたとえてみる

Excel を使ったことがあるなら、リレーショナルデータベースの概念の 80% はすでに理解できています。

Excel の概念データベースの概念説明
1 つの Excel ファイル1 つのデータベース(Database)すべてのデータを入れておく入れ物
1 つの Sheet ワークシート1 つのテーブル(Table)ある種類のデータを保存する
1 行1 件のレコード(Row / Record)1 つの具体的なデータ
1 列1 つのフィールド(Column / Field)データの 1 つの属性
列の見出し列名(Column Name)属性の名前
セルのデータ型データ型(Data Type)整数、文字列、日付など

例で理解する

たとえば、あなたがネットショップを運営していて、ユーザー注文を管理したいとします。

ユーザーテーブル(users):

idnameemailagecity
1張三[email protected]28北京
2李四[email protected]35上海
3王五[email protected]22広州

注文テーブル(orders):

order_iduser_idproductamountorder_date
1011iPhone 1679992024-11-01
1021AirPods9992024-11-05
1032MacBook149992024-11-10

この 2 つのテーブルは user_id でつながっています。これが、リレーショナルデータベースという名前の由来です。テーブル同士に関係があるからです。


基本概念

主キー(Primary Key)

主キーは各レコードの一意な識別子です。身分証番号のようなもので、重複してはいけず、空欄にもできません。

ユーザーテーブルでは:id が主キー → 各ユーザーに一意の id がある
注文テーブルでは:order_id が主キー → 各注文に一意の order_id がある
なぜ主キーが必要なの?

主キーがないと、たとえば「張三」という名前のユーザーが 2 人いたとき、どう区別すればいいでしょうか。主キーはこの問題を解決します。名前が同じでも、id は必ず違います。

外部キー(Foreign Key)

外部キーとは、別のテーブルの主キーを参照するフィールドのことです。テーブル同士の関係を作るために使います。

注文テーブルの user_id は外部キーです。これはユーザーテーブルの id を指していて、「この注文はどのユーザーのものか」を表します。

よくあるデータ型

説明
INTEGER整数1, 42, -100
REAL / FLOAT浮動小数点数3.14, 99.9
TEXT / VARCHAR文字列"張三", "hello"
DATE日付2024-11-01
DATETIME日付と時刻2024-11-01 14:30:00
BOOLEAN真偽値TRUE / FALSE
BLOBバイナリデータ画像、ファイル(あまり使わない)

制約(Constraints)

制約はデータに対するルールの制限で、データの品質を保つためのものです。

制約役割
PRIMARY KEY主キー、一意で空欄不可id
NOT NULL空欄にできないname NOT NULL
UNIQUE値を重複させないemail UNIQUE
DEFAULTデフォルト値city DEFAULT '未知'
FOREIGN KEY外部キー、他のテーブルを参照するuser_id REFERENCES users(id)

よく使われるデータベース管理システム

データベース特徴適用場面
SQLite設定不要で、単一ファイルとして保存される学習、小規模アプリ、モバイル端末
MySQL最も人気のあるオープンソースデータベースWeb アプリ、中小規模プロジェクト
PostgreSQL機能が最も強力なオープンソースデータベース大規模プロジェクト、AI アプリ(ベクトル検索をサポート)
SQL ServerMicrosoft 製企業向けの Windows 環境
この章では SQLite を使う

SQLite はサーバーをインストールする必要がなく、Python には標準で sqlite3 モジュールが入っています。学習に最適です。SQL の文法は他のデータベースでもそのまま使えます。

データベースを初めて学ぶときの、いちばん安定した順番

一般的に、より安定しやすい順番は次のとおりです。

  1. まず「テーブル、主キー、外部キー」の意味をつかむ
  2. 次に SQL の検索を学ぶ
  3. その後で Python からデータベースにつなぐ
  4. 最後にデータベース設計を見る

こうすると、最初からたくさんの SQL の細かいルールを覚えるより、混乱しにくくなります。


実践: はじめてのデータベースを作る

import sqlite3

# 1. データベースに接続する(存在しなければ自動で作成される)
conn = sqlite3.connect("my_shop.db")
cursor = conn.cursor()

# 2. ユーザーテーブルを作成する
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
age INTEGER,
city TEXT DEFAULT '未知'
)
""")

# 3. データを挿入する
cursor.execute("INSERT INTO users (name, email, age, city) VALUES ('張三', '[email protected]', 28, '北京')")
cursor.execute("INSERT INTO users (name, email, age, city) VALUES ('李四', '[email protected]', 35, '上海')")
cursor.execute("INSERT INTO users (name, email, age, city) VALUES ('王五', '[email protected]', 22, '広州')")

# 4. 変更を保存する
conn.commit()

# 5. データを検索する
cursor.execute("SELECT * FROM users")
rows = cursor.fetchall()
for row in rows:
print(row)
# (1, '張三', '[email protected]', 28, '北京')
# (2, '李四', '[email protected]', 35, '上海')
# (3, '王五', '[email protected]', 22, '広州')

# 6. 接続を閉じる
conn.close()

おめでとうございます!
これで、データベースを 1 つ作り、1 つのテーブルを作成し、3 件のデータを保存できました。

この小さな例で、まず何を学ぶべき?

まず学ぶべきなのは、SQL の各キーワードを全部覚えることではありません。
データベースの最小の流れは、実はとてもシンプルです。

  1. データベースに接続する
  2. テーブルを作成する
  3. データを挿入する
  4. 結果を検索する

この流れを先に理解できれば、その後の SQL や Python からの接続も、ずっと分かりやすくなります。


まとめ

概念一言でいうと
データベースすべてのテーブルを入れておく「フォルダ」
テーブルある種類のデータを入れる「Excel ワークシート」
主キー各レコードの「身分証番号」
外部キー2 つのテーブルをつなぐ「つながり」
制約データ品質を守る「ルール」

この節でいちばん持ち帰ってほしいこと

  • リレーショナルデータベースで大事なのは「たくさんのテーブルを保存すること」ではなく、テーブル同士をキーで関係づけられること
  • 主キーは一意に識別するため、外部キーはテーブルをつなぐために使う
  • ここを先にしっかり押さえると、後の SQL や複数テーブルの分析がスムーズになります

実践練習

練習 1: テーブル構造を設計する

図書管理システムのために、2 つのテーブルを設計してください:
- books テーブル: 書名、著者、出版年、価格、分類
- borrows テーブル: 貸出記録(誰がどの本を借りたか、貸出日、返却日)

考えること:
1. 各テーブルの主キーは何ですか?
2. borrows テーブルにはどの外部キーが必要ですか?
3. どのフィールドに NOT NULL 制約を付けるべきですか?

練習 2: SQLite で実践する

# sqlite3 を使って、上で設計した books テーブルと borrows テーブルを作成する
# 5 冊の本と 3 件の貸出記録を挿入する
# すべてのデータを検索して表示する