こんにちは、Nakaです。
データベースのパーティションは便利ですが、現状 Laravel では生 SQL を書かないと使えません。
Laravel のマイグレーションでは、SQLを直接書かずにテーブル定義を行えますが、 その裏側を支えているのが Blueprint と Grammar です。
本記事ではこれらを拡張し、パーティションを Laravel らしく扱える方法を紹介します。
データベースにおけるパーティションとは、大規模なテーブルを特定の列(日時やIDなど)で分割して管理する仕組みで、テーブル運用の効率化に役立ちます。パーティションを利用すると、例えば以下のようなメリットがあります。
パーティションには、Range や Hash、List などいくつかの方式がありますが、ここでは Range パーティションのみを対象として解説します
Laravel標準のマイグレーションではパーティションを直接サポートしていないため、生SQLで記述する必要があります。MySQLで Rangeパーティションを行う場合の処理は以下になります。
DB::statement("
ALTER TABLE logs
PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION pMax VALUES LESS THAN maxvalue
)
");
ただし、この方法には次のような課題があります。
そこで、本記事では Laravel の Blueprint / Grammarを拡張し、以下のように Laravel 風に書けることを目指します。