コンテンツにスキップ

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

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

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

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

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

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

flowchart LR
A["CSV / Excel ファイル"] --> B{"データ量"}
B -->|"数万行"| C["Pandas で十分"]
B -->|"数百万行"| D["データベースが必要"]
B -->|"複数人で同時に使う"| D
B -->|"安全に保存したい"| D
style C fill:#e8f5e9,stroke:#2e7d32,color:#333
style D fill:#fff3e0,stroke:#e65100,color:#333
シーンCSV ファイルデータベース
データ量数万行なら大丈夫、百万行だと重くなる数億行でも軽く処理できる
複数人での協力どこを誰が変えたか分かりにくく、競合しやすい同時読み書きに対応し、権限管理もできる
データの安全性ファイルを消したらなくなるバックアップ、トランザクション、障害復旧がある
検索速度毎回全体を走査する必要があるインデックスがあり、ミリ秒単位で検索できる
データの関連付け複数ファイルを手作業で merge するSQL JOIN ひとつで解決できる

実際の場面の例:

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

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

Section titled “リレーショナルデータベースとは?”

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):

注文テーブル(orders):

  • order_id=101: user_id=1、iPhone 16、7999、2024-11-01
  • order_id=102: user_id=1、AirPods、999、2024-11-05
  • order_id=103: user_id=2、MacBook、14999、2024-11-10

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


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

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

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

flowchart LR
subgraph users["ユーザーテーブル users"]
U["id (主キー) | name | email"]
end
subgraph orders["注文テーブル orders"]
O["order_id (主キー) | user_id (外部キー) | product"]
end
orders -->|"user_id が参照する"| users
style users fill:#e3f2fd,stroke:#1565c0,color:#333
style orders fill:#fff3e0,stroke:#e65100,color:#333

注文テーブルの 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バイナリデータ画像、ファイル(あまり使わない)

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

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

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

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

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

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

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

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

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


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

Section titled “実践: はじめてのデータベースを作る”
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 件のデータを保存できました。

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

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

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

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

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


このページを終えたら、この evidence card を残します。

スキーマ
テーブル名、キー、関係、サンプル行
クエリ
使われた SQL または Python のデータベースコード
出力
result rows、row count、または保存された抽出結果
失敗確認
間違った結合キー、危険なクエリ、トランザクション不足、またはスキーマ不一致
期待される成果
クエリと結果表、および1件のデータ品質メモ
root(("リレーショナルデータベース"))
基本概念
データベース Database
テーブル Table
行 Row
列 Column
重要な仕組み
主キー PK
外部キー FK
制約 Constraints
データ型
よく使うデータベース
SQLite(学習用)
MySQL
PostgreSQL
SQL Server
概念一言でいうと
データベースすべてのテーブルを入れておく「フォルダ」
テーブルある種類のデータを入れる「Excel ワークシート」
主キー各レコードの「身分証番号」
外部キー2 つのテーブルをつなぐ「つながり」
制約データ品質を守る「ルール」

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

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

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

Section titled “練習 1: テーブル構造を設計する”
図書管理システムのために、2 つのテーブルを設計してください:
- books テーブル: 書名、著者、出版年、価格、分類
- borrows テーブル: 貸出記録(誰がどの本を借りたか、貸出日、返却日)
考えること:
1. 各テーブルの主キーは何ですか?
2. borrows テーブルにはどの外部キーが必要ですか?
3. どのフィールドに NOT NULL 制約を付けるべきですか?
# sqlite3 を使って、上で設計した books テーブルと borrows テーブルを作成する
# 5 冊の本と 3 件の貸出記録を挿入する
# すべてのデータを検索して表示する
参考実装と解説
  • 簡単な図書館データベースでは、book_id を主キーにした books テーブルと、独自の borrow_id と本・借り手への外部キーを持つ貸出テーブルが必要です。
  • タイトル、著者、借り手、貸出日は必須なので NOT NULL にします。返却日は貸出時点では不明なため nullable にできます。
  • テーブル作成後、2、3 行を挿入して join クエリを実行します。現実的な質問に答えられて初めて、スキーマ設計に説得力が出ます。