コンテンツにスキップ

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等)';

地域区分

将来的に地域別の区分が必要になった場合:

ALTER TABLE countries
ADD COLUMN region VARCHAR(50) NULL COMMENT '地域区分(アジア、ヨーロッパ、北米等)';