countries テーブル定義
概要
国・地域を管理するマスターテーブル。国際対応や配送先選択で使用する国・地域の選択肢を管理する。
用途: 住所登録、国際配送先選択、国別の分析などで使用。
テーブル情報
| 項目 | 値 |
|---|---|
| テーブル名 | countries |
| エンジン | InnoDB |
| 文字セット | utf8mb4 |
| 照合順序 | utf8mb4_unicode_ci |
| コメント | 国・地域マスター |
カラム定義
| カラム名 | 型 | NULL | デフォルト | キー | 説明 |
|---|---|---|---|---|---|
| id | BIGINT UNSIGNED | NOT NULL | AUTO_INCREMENT | PK | 主キー |
| name | VARCHAR(100) | NOT NULL | - | - | 国名(日本語表記) |
| country_code | VARCHAR(2) | NULL | NULL | INDEX | ISO 3166-1 alpha-2(JP, US, CN等) |
| sort_order | INT UNSIGNED | NOT NULL | 0 | INDEX | 表示順序 |
| is_active | BOOLEAN | NOT NULL | TRUE | INDEX | 有効フラグ |
| created_at | TIMESTAMP | NULL | NULL | - | 作成日時 |
| updated_at | TIMESTAMP | NULL | NULL | - | 更新日時 |
インデックス
| 種別 | 名称 | 対象カラム | 説明 |
|---|---|---|---|
| PRIMARY KEY | pk_countries | id | 主キー |
| INDEX | idx_country_code | country_code | 国コード検索 |
| INDEX | idx_sort_order | sort_order | 表示順序検索 |
| INDEX | idx_is_active | is_active | 有効フラグ検索 |
外部キー制約
なし(マスターテーブルのため)
リレーション
このテーブルは他のテーブルから参照される:
- addresses: 住所情報の国を記録(将来実装)
- shipping_addresses: 配送先の国を記録(将来実装)
- users: ユーザーの国を記録(将来実装)
データ例
| id | name | country_code | sort_order | is_active |
|---|---|---|---|---|
| 1 | 日本 | JP | 1 | TRUE |
| 2 | アメリカ合衆国 | US | 2 | TRUE |
| 3 | 中国 | CN | 3 | TRUE |
| 4 | 韓国 | KR | 4 | TRUE |
| 5 | イギリス | GB | 5 | TRUE |
| 6 | フランス | FR | 6 | TRUE |
| 7 | ドイツ | DE | 7 | TRUE |
備考・注意事項
ISO 3166-1 alpha-2準拠
国コードの規格
- ISO 3166-1 alpha-2: 2文字の英字で表される国コード規格
- 主要国のコード:
- JP: 日本
- US: アメリカ合衆国
- CN: 中国
- KR: 韓国
- GB: イギリス
- FR: フランス
- DE: ドイツ
- 等
国コードのバリデーション
- フォーマット: 2文字のASCII英字(A-Z)のみ
- 大文字変換: 入力時に自動的に大文字に変換される
- NULL許可: 国コードが不明な場合はNULLを許可
参考資料
- ISO 3166-1: https://www.iso.org/iso-3166-country-codes.html
- 国コード一覧: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
国の管理方針
表示順序
- sort_order: 日本を最初に、その後アルファベット順や使用頻度順で並ぶ
- 日本優先: 日本のECサイトとして、日本を最初に表示
有効化ポリシー
- is_active: 有効/無効フラグ
- デフォルト: 主要国は有効(通常は無効化しない)
- 無効化: 配送不可の国などを無効化
クエリ例
-- 有効な国一覧を取得(表示順序順)
SELECT id, name, country_code
FROM countries
WHERE is_active = TRUE
ORDER BY sort_order;
-- 国コードから国情報を取得
SELECT id, name, country_code
FROM countries
WHERE country_code = 'JP'
AND is_active = TRUE;
-- 国別の住所数(将来実装)
SELECT
c.name,
c.country_code,
COUNT(a.id) as address_count
FROM countries c
LEFT JOIN addresses a ON c.id = a.country_id
WHERE c.is_active = TRUE
GROUP BY c.id, c.name, c.country_code
ORDER BY c.sort_order;
Eloquentモデル例
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
protected $fillable = [
'name',
'country_code',
'sort_order',
'is_active',
];
protected function casts(): array
{
return [
'is_active' => 'boolean',
];
}
// 有効な国一覧を取得
public static function getActiveCountries(): Collection
{
return self::where('is_active', true)
->orderBy('sort_order')
->get();
}
// 国コードから取得
public static function findByCode(string $code): ?self
{
return self::where('country_code', strtoupper($code))
->where('is_active', true)
->first();
}
// 並び替え順で取得
public function scopeOrdered($query)
{
return $query->orderBy('sort_order');
}
}
将来の拡張
ISO 3166-1 alpha-3対応
将来的に3文字の国コード(alpha-3)が必要になった場合:
ALTER TABLE countries
ADD COLUMN country_code_alpha3 VARCHAR(3) NULL COMMENT 'ISO 3166-1 alpha-3(JPN, USA, CHN等)';
地域区分
将来的に地域別の区分が必要になった場合: