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 にたとえてみる
Section titled “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) | 整数、文字列、日付など |
例で理解する
Section titled “例で理解する”たとえば、あなたがネットショップを運営していて、ユーザーと注文を管理したいとします。
ユーザーテーブル(users):
id=1: 張三、28 歳、北京、[email protected]id=2: 李四、35 歳、上海、[email protected]id=3: 王五、22 歳、広州、[email protected]
注文テーブル(orders):
order_id=101:user_id=1、iPhone 16、7999、2024-11-01order_id=102:user_id=1、AirPods、999、2024-11-05order_id=103:user_id=2、MacBook、14999、2024-11-10
この 2 つのテーブルは user_id でつながっています。これが、リレーショナルデータベースという名前の由来です。テーブル同士に関係があるからです。
主キー(Primary Key)
Section titled “主キー(Primary Key)”主キーは各レコードの一意な識別子です。身分証番号のようなもので、重複してはいけず、空欄にもできません。
ユーザーテーブルでは:id が主キー → 各ユーザーに一意の id がある注文テーブルでは:order_id が主キー → 各注文に一意の order_id がある外部キー(Foreign Key)
Section titled “外部キー(Foreign Key)”外部キーとは、別のテーブルの主キーを参照するフィールドのことです。テーブル同士の関係を作るために使います。
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 を指していて、「この注文はどのユーザーのものか」を表します。
よくあるデータ型
Section titled “よくあるデータ型”| 型 | 説明 | 例 |
|---|---|---|
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)
Section titled “制約(Constraints)”制約はデータに対するルールの制限で、データの品質を保つためのものです。
| 制約 | 役割 | 例 |
|---|---|---|
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 Server | Microsoft 製 | 企業向けの Windows 環境 |
データベースを初めて学ぶときの、いちばん安定した順番
Section titled “データベースを初めて学ぶときの、いちばん安定した順番”一般的に、より安定しやすい順番は次のとおりです。
- まず「テーブル、主キー、外部キー」の意味をつかむ
- 次に SQL の検索を学ぶ
- その後で Python からデータベースにつなぐ
- 最後にデータベース設計を見る
こうすると、最初からたくさんの 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 の各キーワードを全部覚えることではありません。 データベースの最小の流れは、実はとてもシンプルです。
- データベースに接続する
- テーブルを作成する
- データを挿入する
- 結果を検索する
この流れを先に理解できれば、その後の 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 制約を付けるべきですか?練習 2: SQLite で実践する
Section titled “練習 2: SQLite で実践する”# sqlite3 を使って、上で設計した books テーブルと borrows テーブルを作成する# 5 冊の本と 3 件の貸出記録を挿入する# すべてのデータを検索して表示する参考実装と解説
- 簡単な図書館データベースでは、
book_idを主キーにしたbooksテーブルと、独自のborrow_idと本・借り手への外部キーを持つ貸出テーブルが必要です。 - タイトル、著者、借り手、貸出日は必須なので
NOT NULLにします。返却日は貸出時点では不明なため nullable にできます。 - テーブル作成後、2、3 行を挿入して join クエリを実行します。現実的な質問に答えられて初めて、スキーマ設計に説得力が出ます。