【AlmaLinux 9】MySQL初心者講座 第2回:テーブル設計の極意とデータ型の適切な選び方

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回の第1回では、無事にMySQLを使える環境を整えました。今日からは、その広大なデータベースの中に、実際にデータを格納するための「表(テーブル)」を作っていきます。

初心者の方は「とりあえず項目を並べればいいんでしょ?」と考えがちですが、実はここが一番の踏ん張りどころ。家を建てる前の「設計図」を作る工程と同じです。柱の位置(データ型)や、どの部屋に何を置くか(テーブル分割)を間違えると、後からリフォーム(データ移行)するのは至難の業です。

コウ君

先生、テーブルを作る時、データの種類(型)がいっぱいあってどれを選べばいいか迷います。「全部VARCHAR(文字列)にしておけば困らないんじゃない?」って思っちゃうんですが、それじゃダメなんですか?

リナックス先生

コウ君、それは典型的な「初心者の罠」ね!
全部文字列にすると、例えば「日付順に並び替える」ことができなくなったり、数値の計算が合わなくなったりするの。それに、メモリやディスクの無駄遣いにもなるわ。
今回は、MySQLが持っている「データ型」の特性を理解して、プロがどうやってテーブルを組み立てているのか、その思考プロセスを教えるわね!

📚 MySQL初心者講座・連載ロードマップ(全8回)

  • 【第1回】データベースの概念と最速インストール・初期設定
  • 【第2回】テーブル設計の極意:データ型と主キーの重要性(本記事)
  • 【第3回】SQL基本4操作(CRUD):SELECT/INSERT/UPDATE/DELETEをマスターする
  • 【第4回】データの抽出と並び替え:WHERE句とORDER BYを使いこなす
  • 【第5回】複数のテーブルを繋ぐ:JOIN(結合)の魔法を理解する
  • 【第6回】集計とグループ化:COUNT/SUMとGROUP BYで統計を取る
  • 【第7回】インデックスとパフォーマンス:重いクエリを劇的に速くする方法
  • 【第8回】バックアップと復旧:mysqldumpによるデータ保護と自動化

1. テーブル設計の第一歩:カラムとレコードの役割

MySQLのテーブルは、よくExcelのシートに例えられます。しかし、データベース特有の「決まり」があります。

1-1. カラム(列)は「データの属性」

縦の列を「カラム」と呼びます。ここには「名前」「年齢」「メールアドレス」といった情報の項目を定義します。重要なのは、「1つのカラムには1種類のデータ型しか入れられない」ということです。

1-2. レコード(行)は「データの個体」

横の行を「レコード」または「ロウ」と呼びます。これが1人分のユーザーデータ、あるいは1件の記事データになります。データベースへの命令(SQL)は、このレコード単位で読み書きするのが基本です。


2. これだけは覚えたい!主要な「データ型」一覧

MySQLには多くのデータ型がありますが、初心者が実戦で使うのは以下の4つのカテゴリーに集約されます。

2-1. 数値型 (Numeric Types)

  • INT: 整数。IDや個数、年齢などに使います。
  • DECIMAL: 小数点を含む数値。消費税や金額計算など、正確な計算が必要な場所に使います。

2-2. 文字列型 (String Types)

  • VARCHAR(n): 可変長の文字列。名前や住所など。nには最大文字数を指定します(例: VARCHAR(255))。
  • TEXT: 長文用。ブログの本文など、文字数が予測できない場合に使います。

2-3. 日付・時刻型 (Date and Time Types)

  • DATETIME: 日付と時刻(2026-05-09 10:00:00)。作成日時などに最適。
  • DATE: 日付のみ(2026-05-09)。誕生日など。

2-4. その他

  • BOOLEAN / TINYINT(1): 0か1か(真か偽か)。「退会フラグ」などに使います。

3. 主キー(Primary Key)がなければデータベースにあらず

テーブルを作る際、絶対に欠かしてはいけないのが「主キー(Primary Key)」です。これは、そのテーブルの中でレコードを唯一無二に特定するための番号です。

3-1. 主キーの3条件

  1. 重複しない(Unique): 同じIDの人が2人いてはいけません。
  2. 空であってはならない(Not Null): IDがない人は存在できません。
  3. 不変であること: 原則として、一度決めたら変えない値を使います。

多くの場合、AUTO_INCREMENT(自動連番)という機能を使って、データが入るたびに「1, 2, 3…」と勝手に番号が振られるように設定します。


4. データの重複を防ぐ「正規化」の超基本

例えば「注文テーブル」を作る時、1つのテーブルに「客の名前」「客の住所」「商品名」「単価」を全部詰め込むのはNGです。客が何度も注文すると、同じ名前と住所が何度も記録され、住所が変わった時にすべての行を直さなければならなくなります。

これを防ぐために、「ユーザーテーブル」と「注文テーブル」に分け、IDで紐付けることを「正規化」と呼びます。初心者のうちは「1つのテーブルに情報を詰め込みすぎない」ことを意識しましょう。

[Image illustrating database normalization showing a flat table split into Two Related Tables with a Common ID]


5. 実践:ユーザー管理テーブルを作ってみよう

前回作成した linux_koubou_db を使って、実際にテーブルを作成するSQLを打ってみましょう。

# データベースを選択
USE linux_koubou_db;

# テーブル作成
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    age INT,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

解説:

  • NOT NULL: 空っぽでの登録を禁止します。
  • UNIQUE: 同じメールアドレスの重複登録をエラーにします。
  • DEFAULT CURRENT_TIMESTAMP: 登録した瞬間の時刻を勝手に記録してくれます。

6. AIにテーブル設計をレビューさせる魔法のプロンプト

自分で考えた設計が正しいか不安な時は、AIにレビューさせましょう。これが上達への最短ルートです。

6-1. 設計レビュー用プロンプト

「MySQLで『ブログのコメント機能』のテーブルを作ろうとしています。
以下のSQLを作成しましたが、プロの視点で修正点や不足しているカラム、適切なデータ型のアドバイスをください。

CREATE TABLE comments (
    id INT,
    user_name TEXT,
    comment_text TEXT,
    date TEXT
);

特に、主キーの設定や日付型の選び方について教えてください。」

AIは「IDにAUTO_INCREMENTをつけましょう」「日付はTEXTではなくDATETIMEにすべきです」「返信機能を想定してparent_idを追加してはどうですか?」といった、自分では気づけなかった視点を与えてくれます。


まとめ:適切な設計がシステムの寿命を延ばす

第2回の講座、お疲れ様でした!

今日は、単にコマンドを覚えるのではなく、「データ型を使い分ける意味」や「主キーの重要性」といった、データベースの根幹となる思想を学びました。地味な作業に見えますが、ここがしっかりしていれば、後のSQL操作が驚くほど楽になります。

次回、第3回「SQL基本4操作(CRUD):SELECT/INSERT/UPDATE/DELETEをマスターする」では、今日作ったテーブルに実際にデータを入れ、取り出し、書き換えるという、DB操作の核心部分に迫ります。ついにデータが動き始めますよ。お楽しみに!

▼ 設計したDBを動かしてみよう ▼

AlmaLinux 9+MySQL 8.0が
サクサク動く「高性能VPS」

VPSおすすめ比較

データベース設計スキルを活かして
「エンジニアとしての格を上げる」

エンジニア転職の相談

コメント