doc.dev1x.org

仮予約テーブルパターン

1. 目的

2. 課題

3. 解決策

予約テーブルを導入

-- インデックスやFKなどは省略

-- アイテムテーブル
CREATE TABLE items (
    id BIGINT PRIMARY KEY,
    total_capacity INT NOT NULL,
    -- その他リソース情報
);

-- 予約テーブル
CREATE TABLE reservations (
    id BIGINT PRIMARY KEY,
    item_id BIGINT NOT NULL,
    user_id BIGINT NOT NULL,
    quantity INT NOT NULL,
    status VARCHAR(20) NOT NULL, -- 'pending', 'confirmed', 'cancelled', 'expired'
    reserved_at TIMESTAMP NOT NULL,
    confirmed_at TIMESTAMP,
    expires_at TIMESTAMP NOT NULL
);
SELECT 
    items.total_capacity - COALESCE(SUM(reservations.quantity), 0) AS available
FROM items
LEFT JOIN reservations ON items.id = reservations.item_id
    AND reservations.status IN ('pending', 'confirmed')
WHERE items.id = ?
GROUP BY items.id;

予約テーブルのクリーンアップ処理も追加する

4. メリット

5. デメリット

6. 注意

参考資料