実行ボタンを押してください。
0 箱
| 注文ID | 寄付者ID | サイズ | 割当先農家 |
|---|---|---|---|
| 実行ボタンを押してください。 | |||
| ID | 農園名 | キャパ | 属性 |
|---|
| 注文ID | 寄付者ID | サイズ |
|---|
従来のSQL/IF文による個別開発と、完全縦持ちDB×SBM方式の決定的な違い
❌ 膨大・泥臭いスパゲティコード
「A農園優先」「同一寄付者は同日」等の条件を幾重ものIF文や入れ子のループ、重いJOINで書き下す必要があり、ロジックが肥大化する。
SELECT order_id,
CASE
WHEN f.is_newbie = 1 AND o.box_size = '5kg' THEN 'farmer_B'
WHEN (SELECT COUNT(*) FROM orders o2
WHERE o2.donor_id = o.donor_id) > 1
AND o.box_size = '10kg' THEN 'farmer_A'
/* ここから無限に続く条件分岐とJOINの嵐... */
ELSE 'pending'
END as assigned_farmer
FROM orders o LEFT JOIN farmers f ON ...
❌ 横に広がる(テーブルカラムの増加)
新しいルール(新人フラグ、要注意フラグ等)が出るたびに基幹DBにカラムを追加。既存のシステム間連携IF(インターフェース)を破壊する。
❌ 再開発・再デプロイ・全結合テスト
「夏モードを追加」となったらソースコードを書き換えて再コンパイル。他のロジックが先祖返りやバグを起こしていないか、全テストが必要。
❌ 次元の呪いによるタイムアウト
データ量や制約が1つ増えるだけでSQLの実行計画が狂い、処理時間が指数関数的に跳ね上がっていつかフリーズする。
⭕️ 極小(基盤は1週間で実装可能)
アプリ側はDBの値を数式(ペナルティ関数)に変換してSBMに投げるだけ。ロジック自体を条件分岐(IF文)でガチガチに作り込む必要がない。
// 状態(割り当て先)が渡されるのでペナルティを計算するだけ
let mut penalty = 0.0;
// 同一寄付者のバラバラ出荷ペナルティ
if donor_assignments.len() > 1 {
penalty += (donor_assignments.len() - 1) as f64 * weight_donor;
}
// 新人ひいきボーナス
penalty -= farmer.is_newbie as f64 * count * weight_farmer_bias;
// ... あとはSBMが勝手に全体最適を計算し尽くす!
⭕️ 縦に伸びる(データ行の追加のみ)
ルールも変数もすべて単一の共通テーブルの「行」で吸収。既存システムとデータをやり取りする連携IFは最初から最後まで1ミリも変わらない。
⭕️ ノンストップ(開発改修ゼロ)
管理者画面からDBに「夏フラグ: 1」の行を1行 INSERT するだけで即時対応。プログラムの変更も、再デプロイも、再起動すら不要。
⭕️ 爆速・ミリ秒単位でスケール
計算はsqlxでロードしたRustのメモリ上で完結。SBM(模擬分岐法)なので、どれだけ変数や制約が増えてもフリーズせずコンマ数秒でタフに解き切る。
結論:既存システムを1ミリも汚さない「DB to DB」のステートレス設計
基幹DBからデータを吸い上げ、Rustが1秒でパズルを解き、結果を書き戻して即座に終了する。常駐もしないためバグの入りようがない。だから「連動システム」側の改修コストも極限まで引き下げられます。