Laravelでは通常、モデルの主キーは数値のインクリメントした値を使用することになりますが、負荷分散やIDの漏洩を防ぐためにULIDを主キーにする方法を紹介します。
目次
Laravelで主キーをULIDにする
まずは主キーにする方法を紹介します。
ULIDに対応するにはマイグレーションファイルで id
をULIDの型に指定して、モデルでULIDを使用するように指定するだけで完了です。
Schema::create('articles', function (Blueprint $table) {
$table->ulid('id')->primary();
$table->string('title');
$table->timestamps();
});
use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
use HasUlids;
}
$article = Article::create(['title' => 'サンプル作成']);
$article->id; // "01gd4d3tgrrfqeda94gdbtdk5c"
Laravel 9系以上であれば公式でUUIDとULIDに対応する事が可能なため、非常にお手軽に設定することができます。
詳細については公式ドキュメントを参照してください。
https://laravel.com/docs/10.x/eloquent#uuid-and-ulid-keys
ULIDに対応する利点
LaravelのULIDについて調べている方には不要かもしれませんが、私が考えるULIDに対応する利点を書いていきます。
- IDの漏洩の心配が無くなる
- URLパスに最適な文字列
- ソートができる
- 同時作成時のID採番の負荷が無くなる
こちらの3点になります。
IDの漏洩の心配が無くなる
デフォルトのインクリメント方式だと公開していない全体ユーザー数の推測であったり、URL直でアクセスして本来到達できないはずのページを閲覧されてしまうリスクを回避する事ができます。
URLパスに最適な文字列
ULIDはBase32エンコーディングされるため、URLやファイルパスなどで使用する際に適した文字セットを持っています。
これにより、文字化けやエスケープ処理の問題を回避することができます。
ソートができる
IDを数値で設定する以外の選択肢としては UUID か ULID にする事ですが、UUIDは完全にランダムなのでソートできません。
ULIDは前半がソート可能な文字列になっているのが利点です。
同時作成時のID採番の負荷が無くなる
IDである主キーがインクリメント方式だと書き込み対象のDBが1台になってしまうのですが、ULIDであればアプリケーションが決めたIDをそのまま保存するだけなのでDBを複数台にする事が可能になります。
終わりに
以上、LaravelでULIDに対応する方法でした。
LaravelはデフォルトでULIDに対応する方法が用意されているのでサクッと設定できるのが良いですね。
モデルへの指定だけ忘れずに記述してくれれば問題なく設定できます。
お疲れ様でした。
コメントを残す