STEP 6:命名規則とベストプラクティス

📝 STEP 6: 命名規則とベストプラクティス

読みやすく保守しやすいデータベース設計のための命名ルール

📋 このステップで学ぶこと
  • テーブル名の命名規則(単数形 vs 複数形)
  • カラム名の命名規則(スネークケース vs キャメルケース)
  • 予約語の回避方法
  • 国際化対応(文字コード、タイムゾーン)
  • ドキュメント作成のコツ

学習時間の目安: 3時間 | 前提知識: STEP 1-5修了

🎯 1. なぜ命名規則が重要なのか?

STEP 5までの設計を「読みやすく」する

STEP 5までで、テーブル設計の基本要素(エンティティ、データ型、主キー、外部キー)を学びました。しかし、実際のコードを見てみると…

【実際に書いたコード例】 CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), email VARCHAR(255), created_at TIMESTAMP );

このコードの「users」「user_id」「created_at」などの名前の付け方には、ルール(命名規則)があります。このSTEP 6では、読みやすく保守しやすいコードを書くための命名規則を学びます。

命名規則の定義

📝 命名規則とは

命名規則(Naming Convention)=テーブル名やカラム名のつけ方のルール

良い命名規則のメリット

👁️ コードが読みやすい

誰が見てもすぐ理解できる。「このカラムは何?」と迷わない。

🔧 保守しやすい

後からの変更や追加が楽。ルールに従えばいいだけ。

🐛 バグが減る

typoや間違いに気づきやすい。統一されているから違和感がわかる。

👥 チーム開発が円滑

全員が同じルールで統一。「なぜこの名前?」という議論が減る。

悪い命名と良い命名の比較

❌ 悪い命名の例
— 統一性がない table1, tbl_users, UserData, CUSTOMERS — 意味不明 t1, data, info, temp — 長すぎる user_information_table_for_customer_management_system — 予約語を使用 user, order, select, from
✅ 良い命名の例
— 統一されている users, products, orders, customers — 意味が明確 user_id, created_at, total_amount — 適度な長さ order_details, product_categories — 予約語を回避 users (userではなく), orders (orderではなく)

📊 2. テーブル名の命名規則

単数形 vs 複数形

テーブル名は単数形複数形、どちらを使うべきか論争があります。

🤔 単数形 vs 複数形の比較
形式 メリット デメリット
複数形(推奨) users, products 直感的、英語として自然、主流 不規則複数形が面倒
単数形 user, product シンプル、不規則形がない 予約語と衝突しやすい
💡 推奨:複数形を使う

現代のデータベース設計では、複数形が主流です。

理由:
・多くのフレームワーク(Ruby on Rails、Django、Laravelなど)が採用
・「ユーザーたち」のテーブルなので英語として自然
・予約語との衝突が少ない(user→users で回避)

ただし、プロジェクト内で統一することが最も重要です。

テーブル名の5つのルール

1. 小文字を使う
✅ users, products, orders ❌ Users, PRODUCTS, Orders 理由:大文字小文字を区別するDBMS(Linux上のMySQLなど)があるため
2. 複数形を使う
✅ users, products, orders ❌ user, product, order
3. アンダースコア(スネークケース)を使う
✅ order_details, product_categories ❌ OrderDetails, productCategories
4. 短く、意味が明確
✅ users, orders, products ❌ u, ord, prod(短すぎ) ❌ user_information_management_table(長すぎ)
5. 予約語を避ける
✅ users(複数形にすれば回避) ❌ user, order, select, from, table

中間テーブルの命名

多対多の中間テーブルには、2つの命名方法があります。

方法1: 2つのテーブル名を結合
— 学生と授業 student_courses または course_students — ユーザーとロール user_roles
方法2: ビジネス用語を使う(推奨)
— 学生と授業 → 履修 enrollments — ユーザーと商品 → 注文 orders — ユーザー同士 → フォロー follows
💡 推奨

ビジネス的な意味がある場合は、その名前を使う(enrollments、orders など)。
特に意味がない場合は、2つのテーブル名を結合(user_roles など)。

🔤 3. カラム名の命名規則

スネークケース vs キャメルケース

📝 記法の比較
記法 使用場面
スネークケース(推奨) user_id, created_at データベース
キャメルケース userId, createdAt JavaScript等
💡 推奨:スネークケースを使う

データベースでは、スネークケースが圧倒的に主流です。

理由:
・SQL文で読みやすい(WHERE user_id = 1)
・大文字小文字を気にしなくていい
・MySQLやPostgreSQLの慣例

カラム名の6つのルール

1. テーブル名を含めない(外部キーは例外)
— users テーブル ✅ id, name, email ❌ user_id, user_name, user_email — ただし、外部キーは例外 orders テーブル → user_id(外部キー)はOK
2. 主キーは “id” または “テーブル名_id”
— 方法1: シンプルに id CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY ); — 方法2: テーブル名_id(より明示的) CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY ); どちらでもOK、プロジェクト内で統一する
3. 外部キーは “参照先テーブル名_id”
orders テーブル: user_id ← users テーブルを参照 product_id ← products テーブルを参照
4. 日時カラムは “_at” を使う
✅ created_at, updated_at, published_at, deleted_at ❌ create_date, update_time
5. 論理値(Boolean)は “is_” や “has_” を使う
✅ is_active, is_deleted, has_profile, has_paid ❌ active, deleted, profile, paid
6. カウント系は “_count” を使う
✅ login_count, view_count, follower_count ❌ logins, views, followers

命名の実例

📝 良い命名の例(usersテーブル)
CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(255) NOT NULL, password_hash CHAR(60) NOT NULL, first_name VARCHAR(50), last_name VARCHAR(50), birth_date DATE, is_active TINYINT DEFAULT 1, is_email_verified TINYINT DEFAULT 0, login_count INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, last_login_at DATETIME );

⚠️ 4. 予約語の回避方法

予約語とは

📝 予約語とは

予約語(Reserved Words)=SQLで特別な意味を持つ単語

⚠️ 主な予約語
SELECT, FROM, WHERE, ORDER, GROUP, BY, HAVING, JOIN INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, TABLE USER, INDEX, KEY, CONSTRAINT, DATABASE, SCHEMA INT, VARCHAR, TEXT, DATE, TIMESTAMP AND, OR, NOT, IN, LIKE, IS, NULL COUNT, SUM, AVG, MAX, MIN

予約語を使った場合の問題

— ❌ “user” は予約語なのでエラー CREATE TABLE user ( id INT ); — エラー: You have an error in your SQL syntax — ❌ “order” も予約語 CREATE TABLE order ( id INT ); — エラー!

予約語の回避方法

方法1: 複数形にする(推奨)
✅ users, orders, groups ❌ user, order, group
方法2: バッククォート(`)で囲む
CREATE TABLE `user` ( `id` INT ); — 動くが、推奨されない(常にバッククォートが必要)
方法3: 接頭辞/接尾辞をつける
✅ tbl_user, user_table, app_user — ただし、冗長なので推奨されない
💡 結論:複数形にすれば、ほとんどの予約語を回避できます。

🌍 5. 国際化対応

文字コードの設定

💡 推奨:UTF-8(utf8mb4)を使う
— データベース作成時 CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; — テーブル作成時 CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
📝 utf8mb4 とは?
  • ✅ 4バイトUTF-8(絵文字も保存できる)
  • ✅ 多言語対応(日本語、中国語、韓国語、アラビア語など)
  • ✅ 絵文字(😀🎉)も保存可能
  • ✅ MySQL 5.5.3以降で使用可能
⚠️ utf8 vs utf8mb4
— ❌ utf8(古い) — 3バイトUTF-8で、絵文字が保存できない — ✅ utf8mb4(推奨) — 4バイトUTF-8で、絵文字も保存できる 例: utf8 → ‘😀’ を保存できない(エラー) utf8mb4 → ‘😀’ を保存できる

タイムゾーンの扱い

1. TIMESTAMPを使う(UTC保存)
CREATE TABLE posts ( post_id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); — TIMESTAMP は UTC で保存される — 読み取り時に、セッションのタイムゾーンに変換される
2. アプリケーション側でタイムゾーン変換
— データベースは UTC で保存 — アプリケーションで表示時に変換 例(PHP): $date = new DateTime($created_at, new DateTimeZone(‘UTC’)); $date->setTimezone(new DateTimeZone(‘Asia/Tokyo’)); echo $date->format(‘Y-m-d H:i:s’);

多言語対応

方法1: 言語ごとにカラムを分ける
CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, name_en VARCHAR(200), — 英語 name_ja VARCHAR(200), — 日本語 name_zh VARCHAR(200) — 中国語 ); メリット:シンプル、クエリが簡単 デメリット:言語が増えるとカラムが増える
方法2: 翻訳テーブルを分ける(推奨)
— 商品マスタ CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, price DECIMAL(10, 2) ); — 翻訳テーブル CREATE TABLE product_translations ( translation_id INT AUTO_INCREMENT PRIMARY KEY, product_id INT NOT NULL, language_code CHAR(2) NOT NULL, — ‘en’, ‘ja’, ‘zh’ name VARCHAR(200), description TEXT, FOREIGN KEY (product_id) REFERENCES products(product_id), UNIQUE KEY (product_id, language_code) ); メリット:言語が増えても構造が変わらない デメリット:JOIN が必要で若干複雑

📚 6. ドキュメント作成のコツ

なぜドキュメントが必要?

👤 新メンバーの理解が早い

ドキュメントがあれば、すぐにキャッチアップできる。

🔧 保守がしやすい

後から見返せる。「なぜこの設計?」がわかる。

🐛 バグが減る

設計意図が明確だと、間違いに気づきやすい。

💬 コミュニケーションが円滑

認識のズレが減り、議論がスムーズ。

ドキュメントに含めるべき内容

📋 必須ドキュメント

1. ER図

テーブル間の関係が一目でわかる(draw.io、Lucidchart、MySQL Workbenchなどで作成)

2. テーブル定義書

各テーブルの詳細情報(カラム名、データ型、制約、説明)

3. DDL(CREATE文)

実際のテーブル作成SQL(バージョン管理に含める)

4. 設計の意図・理由

なぜこの設計にしたのか、検討した代替案、制約事項

テーブル定義書の例

📊 usersテーブル定義書
カラム名 データ型 NULL キー 説明
user_id INT NO PK ユーザーID(主キー)
username VARCHAR(50) NO UNIQUE ユーザー名
email VARCHAR(255) NO UNIQUE メールアドレス
is_active TINYINT NO 有効フラグ(0:無効, 1:有効)
created_at TIMESTAMP NO 登録日時

コメントの活用

— MySQLではテーブルやカラムにコメントをつけられる CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT ‘ユーザーID’, username VARCHAR(50) NOT NULL COMMENT ‘ユーザー名(ログインID)’, email VARCHAR(255) NOT NULL COMMENT ‘メールアドレス’, is_active TINYINT DEFAULT 1 COMMENT ‘有効フラグ(0:無効, 1:有効)’, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT ‘登録日時’ ) COMMENT=’ユーザー情報テーブル’; — コメントを確認 SHOW CREATE TABLE users; SHOW FULL COLUMNS FROM users;

📝 STEP 6 のまとめ

✅ このステップで学んだこと
  • 命名規則は、プロジェクト内で統一することが最重要
  • テーブル名は複数形、小文字、スネークケースが推奨
  • カラム名も小文字、スネークケースを使う
  • 主キーはidまたはテーブル名_id
  • 外部キーは参照先テーブル名_id
  • 日時は_at、論理値はis_has_
  • 予約語は複数形にすることで回避
  • 文字コードはutf8mb4を使う
  • ドキュメント(ER図、テーブル定義書)を必ず作成
💡 迷ったらこれ!

✅ テーブル名:複数形、小文字、スネークケース(users, order_details)
✅ カラム名:小文字、スネークケース(user_id, created_at)
✅ 文字コード:utf8mb4
✅ ドキュメント:必ず作成

🎯 次のステップへ

これでSTEP 1〜6の基礎理論編が完了しました!
次のSTEP 7からは、正規化編に入ります。データの冗長性を排除し、整合性を保つ設計手法を学びましょう!

📝 練習問題

問題 1 基礎

テーブル名に複数形を使うことが推奨される理由を2つ挙げてください。

【解答例】
  1. 直感的:「ユーザーたち」のテーブルなので、複数形が自然
  2. 予約語を回避:user、order などの予約語を users、orders にすることで回避できる
問題 2 基礎

以下のカラム名を、スネークケースに修正してください。
userId, createdAt, firstName, totalAmount

【解答】
  • userId → user_id
  • createdAt → created_at
  • firstName → first_name
  • totalAmount → total_amount
問題 3 基礎

予約語を回避する最も簡単な方法は何ですか?

【解答】

複数形にする
例:user → users、order → orders、group → groups

問題 4 応用

以下のテーブル定義の問題点を指摘し、修正してください。

CREATE TABLE User ( ID INT, UserName VARCHAR(50), eMail VARCHAR(255), createDate TIMESTAMP );
【問題点と修正】
  1. User(大文字)→ users(小文字、複数形)
  2. ID(大文字)→ user_id(小文字)
  3. UserName(キャメルケース)→ username
  4. eMail(変則的)→ email
  5. createDate → created_at(_atを使う)
CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50), email VARCHAR(255), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
問題 5 応用

論理値(Boolean)を表すカラム名を、適切な命名規則で3つ作成してください。

【解答例】
  • is_active(有効かどうか)
  • is_deleted(削除済みかどうか)
  • has_profile(プロフィールを持っているか)

ポイント:is_ や has_ で始めることで、論理値だとわかりやすくなります。

問題 6 応用

学生(students)と授業(courses)の多対多の中間テーブル名として、適切な名前を2つ挙げてください。

【解答例】
  1. enrollments(ビジネス用語:履修)
  2. course_students または student_courses(テーブル名結合)

推奨:ビジネス的な意味(履修)があるので、enrollments が最適です。

問題 7 発展

utf8 と utf8mb4 の違いを説明し、どちらを使うべきか答えてください。

【解答】

utf8:3バイトUTF-8。絵文字が保存できない。

utf8mb4:4バイトUTF-8。絵文字も保存できる。

結論:utf8mb4 を使うべき。現代のアプリケーションでは絵文字を使うことが一般的で、utf8mb4 ならすべての文字を安全に保存できます。

問題 8 発展

ブログ記事の多言語対応(英語と日本語)を行うためのテーブル設計を、適切な命名規則に従って作成してください。

【解答例】
— 記事マスタ CREATE TABLE posts ( post_id INT AUTO_INCREMENT PRIMARY KEY, author_id INT NOT NULL, is_published TINYINT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (author_id) REFERENCES users(user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; — 翻訳テーブル CREATE TABLE post_translations ( translation_id INT AUTO_INCREMENT PRIMARY KEY, post_id INT NOT NULL, language_code CHAR(2) NOT NULL, — ‘en’, ‘ja’ title VARCHAR(200) NOT NULL, content TEXT NOT NULL, FOREIGN KEY (post_id) REFERENCES posts(post_id), UNIQUE KEY (post_id, language_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

❓ よくある質問

Q1: プロジェクトの途中で命名規則を変更できますか?

技術的には可能ですが、非常に大変です。既存のSQLクエリ、アプリケーションコード、テストを全て修正する必要があります。そのため、プロジェクト開始時に命名規則を決めておくことが重要です。

Q2: id と user_id、どちらを主キーにすべきですか?

どちらでも問題ありませんが、プロジェクト内で統一しましょう。idはシンプルで、ORMフレームワークが前提としていることが多いです。user_idはより明示的でJOIN時にわかりやすいです。

Q3: テーブル名に接頭辞(tbl_、app_ など)をつけるべきですか?

基本的には不要です。冗長でタイプ数が増えます。例外として、複数のアプリケーションが1つのDBを共有する場合は有効です。

Q4: ドキュメントは必ず作成しないといけませんか?

はい、強く推奨します。特にER図、DDL、テーブル定義書は必須です。最初は面倒でも、後で必ず役に立ちます。

Q5: 既存プロジェクトの命名規則がバラバラです。どうすればいいですか?

段階的に統一していきましょう。新規テーブルは新しいルールに従い、既存テーブルは大規模な修正時に合わせて変更します。現在の状態と目指す姿をドキュメント化しておくことも重要です。

📝

学習メモ

データベース設計・データモデリング - Step 6

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE