Prompt

RustのORMに論理削除へのサポートが薄いと言われているのはなぜ?

おっと、RustのORM(DieselやSeaORMなど)に触れ始めたんだね!その「薄さ」の理由は、まさにキミがさっき心地よいと感じた**「Rustの厳格すぎる規律」と「論理削除という曖昧なハック」が真っ向から衝突しているから**なんだ。

情報工学的に解剖すると、非常に面白い「設計思想の対立」が見えてくるよ!


1. 「型」による完全性の追求(ムチの側面)

Rustは「コンパイルが通ればメモリ安全で正しい」という世界観だよね。一方で、論理削除は**「DB上には存在するけど、アプリケーション的には存在しないことにする」**という、いわば「嘘」をつく行為なんだ。

  • ORMの自動フィルタ: RailsのActiveRecordなどは、裏側で勝手に WHERE is_deleted = false を付け足してくれる。これは便利だけど、Rustの精神からすると「明示的でない魔法」であり、**「型やクエリが勝手に書き換えられる不透明さ」**を嫌う傾向があるんだ。

  • Join時の複雑性: is_deleted が絡むと、1対多の結合(Join)をした時に、「親は生きてるけど子は消えてる」といった状態が頻発する。RustのORMはこれを厳密に型で扱おうとするため、自動化しようとするとジェネリクスのパズルが複雑になりすぎて、ライブラリの維持が困難になるんだね。


2. 所有権とライフサイクルの哲学

Rustには「所有権」という概念がある。

  • 物理削除: メモリの解放(Drop)と同じ。存在しなくなるから、アクセスすればエラー。明確だね。

  • 論理削除: 「死んでいるけど、死体(データ)はそこにある」状態。

Rustのエンジニアは、**「消したはずのデータに型レベルでアクセスできてしまう不完全さ」**を嫌う。もし論理削除を徹底するなら、AliveUser 型と DeletedUser 型を厳密に分けたい……と考えるけど、既存のSQLとの相性が悪すぎて、結局「手動で WHERE を書いたほうがマシ」という結論になりがちなんだ。


3. 「暗黙」より「明示」を好む文化

Rust界隈では、**「ライブラリが魔法でクエリを書き換えるくらいなら、プログラマが明示的に書くべきだ」**という風潮が強い。

  • Diesel: SQLに近い記述を重視するため、勝手にフィルタを追加するような隠蔽を避けている。

  • SeaORM: 多少のサポートはあるけど、それでもActiveRecordほどの「全自動感」はない。

キミが「自由を制限して進むべき道を示す感じが心地いい」と言ったけど、RustのORMにとっては、「勝手にSQLを改変しない」という制限こそが、開発者にクエリの真実を示す道だと考えているんだね。


💡 豆知識:Rustでの「エロガント」な解決策

Rustで論理削除を「規律正しく」扱うなら、**View(仮想テーブル)**を使うのが一番美しいとされているよ。

  1. DB側に active_users という、is_deleted = false だけを抽出したViewを作る。

  2. RustのORMからは、そのViewを「一つのテーブル」として読み込む。

これなら、ORM側に複雑なマクロや魔法を積まなくても、「型システムを騙すことなく、クエリもシンプルに保てる」。まさに、和声法を守りながら転調するような、スマートな解決策だね!


🌟 結論:規律が「安易なハック」を拒んでいる

RustのORMが論理削除に冷たいのは、手抜きをしているからではなく、**「中途半端な魔法を導入して、型安全性の透明度を下げたくない」**という、強いエンジニアリングの矜持(プライド)があるからなんだ。

キミがこれから「AXON」のバックエンドをRustで書くなら、この「明示性の美学」に則って、一歩一歩クエリを組み上げていく楽しさを味わえるはずだよ!

次は、このRustの「厳格さ」を象徴する、**「なぜRustには継承(Inheritance)がないのか?」**という、オブジェクト指向との決別についての熱い話をしてみる?😉

Would you like to explore why Traits over Inheritance is the core design principle in Rust?