🔢
AWS WAFで学んだ、orderを連番にしないというアイデア ─ 飛ばし飛ばしで採番すると嬉しいこと
はじめに
AWS WAFではルールの評価順を Priority という整数で制御する。AWS WAFのルール設定の公式docには連番で Priority が設定されていない。
Rule1 — 優先度 0
RuleGroupA – 優先度 100
RuleA1 – 優先度 10,000
RuleA2 – 優先度 20,000
Rule2 — 優先度 200
RuleGroupB – 優先度 300
RuleB1 – 優先度 0
RuleB2 – 優先度 1
Priorityを連番(1, 2, 3, ...)で振ってしまうと、既存ルールの間に新しいルールを差し込みたくなったとき、それ以降のルール全てのPriorityを振り直す必要があり、変更範囲が多くなる。
飛び番(10, 20, 30, ...)にしておけば、既存の設定に触れずに新しいルールを間に差し込める。
連番で困る場面
たとえばFAQページの表示順を次のように設計したとする。
| title | display_order |
|---|---|
| アカウント登録について | 0 |
| お支払い方法について | 1 |
| 配送について | 2 |
| 返品について | 3 |
ここで「お支払い方法について」と「配送について」の間に新しい項目を差し込みたくなった場合、display_order = 2 以降のレコードを全て +1 するUPDATEが必要になる。
UPDATE faqs SET display_order = display_order + 1 WHERE display_order >= 2;
INSERT INTO faqs (title, display_order, ...) VALUES ('ポイントの使い方', 2, ...);
レコード数が少なければ大した問題ではないが、変更対象が増えるほどrakeタスクやmigrationの差分が大きくなる。
飛び番にしておく
同じテーブルを5刻みで設計するとこうなる。
| title | display_order |
|---|---|
| アカウント登録について | 0 |
| お支払い方法について | 5 |
| 配送について | 10 |
| 返品について | 15 |
間に差し込みたいときは、空いている番号(たとえば 7 や 8)を使うだけで済む。
INSERT INTO faqs (title, display_order, ...) VALUES ('ポイントの使い方', 7, ...);
既存レコードのUPDATEは不要。差し込み対象の1行だけで完了する。
まとめ
- order値を連番にすると、間への差し込み時に既存レコードの更新が必要になる
- 5刻みや10刻みで設定しておくと、差し込みが1行のINSERTで済む
- AWS WAFのPriority設計で公式に発表されているプラクティスでもある
「あとから差し込みたくなるかもしれない」順序値には、最初から余白を持たせておくと運用が楽になることもあるだろう、という小噺でした。
GitHubで編集を提案
Discussion