パスワードを忘れた? アカウント作成
337601 story
プログラミング

オブジェクト関係マッピングはアンチパターン ? 40

ストーリー by reo
オワパターンという新語を考えてみた 部門より

ある Anonymous Coward 曰く、

開発現場にオブジェクト関係マッピング (ORM) が登場してから長い年月が経つが、ORM がアンチパターンだという主張がなされ、一部で話題となっている (Seldo.Com Blog の記事A-Listers の記事より) 。

発端となったのは「ORM が危険なアンチパターンだっていうのはどれだけ言っても言い過ぎることはない」という Laurie Voss 氏のツィート。これに各方面から返信が寄せられ、それに対して書かれたのが先に挙げた Seldo.com Blog の記事である。

主張の詳細は上述のリンク先を見ていただいた方がよいと思うが、実際 ORM はアンチパターンなのだろうか ? タレコミ者はどちらかというと乱雑に書かれた SQL で苦労してきた経験があるため、ORM はより望ましい手法だと考えていた。/.J 諸氏の見解を伺いたい。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  •  SQLデータベースをまるで単なるデータ置き場のように使うのって、OOP(しか知らない)連中が主に使っていたと思われるMySQLが5.0になるまでストプロはおろかビューすら実装されてない状態だったからじゃないですかね。
     本来RDBMSを使う意味っていうのは、SQLを使って「何が欲しいか」だけ指定すれば、データ処理の詳細のロジックを作りこまなくてもオプティマイザがよしなにやってくれるので開発/実行効率がいいというところにあるわけで、オブジェクトをそのまま保存/取出しするなんていうことならそもそもSQLなんていう大オーバーヘッドを持っているRDBMSを使う意味がない。
     でもOOPの連中はSQLプログラミングの手段としてのストプロとかビューというものを知らなかったから、その辺がピンと来てなかったんじゃないですかね。だからご苦労様なことにデータ操作のロジックをシコシコOOPで書いていた。というかMySQLにこだわるなら実際そうするしかなかったわけだし。
     で、最近はMySQLでもそのあたりのサポートが充実してきたんで、ようやくそのことに気付いた人たちによる揺り戻しが来ていると。

    • by Anonymous Coward on 2011年06月22日 0時09分 (#1974245)
      # オフトピだけど、「OOPの連中」を自負しているので脊髄反射

      さすがに「ストアド?ビュー?あぁ、忘れてたわ」というレベルの強者はレアかと(笑)

      すっげーSQLやらストアドやらを使うと確かに実装速度も動作速度も速いんですけど、

      1. 実装終わった。単体テストしよう
      2. テスト用のデータ投入する必要あるけど、外部キーが邪魔で既存データtruncateできないんスけど
      3. 一時的に制約消してデータ投入
      4. テスト後に整合性とれたデータの復元が出来なくて、テスト用dump復元するハメに

      みたいなことが度々あって、面倒くさくなってテスト作成/実行しなくなっちゃうってことありません?
      自分はこの流れでDBに複雑な処理を置かなくなりました。

      楽したいのは山々なんだけど、

      • 高頻度でテストすることが困難な処理は、よほどのヘマをしない限りバグらないようにシンプルに
      • 複雑な処理は、軽量&大量のテストケースで品質確保

      という方針をとっていると、DB内で複雑な処理をやらなくなるのは仕方の無いことなのかなーと思ったり。

      親コメント
      • by Anonymous Coward

        > みたいなことが度々あって、面倒くさくなってテスト作成/実行しなくなっちゃうってことありません?
        > 自分はこの流れでDBに複雑な処理を置かなくなりました。

        は?なんでこんなのが"参考になる"なんだよ

        DBに処理任せないでも実行速度で困らない程度の実装しかしてないんでしょうか?幸せなんですね。

        仕事でプログラム書かれてるなら、なんで商用RDBがあんな複雑な処理ができるのか少しは考えたほうがいいです。

        • みたいなことが度々あって、面倒くさくなってテスト作成/実行しなくなっちゃうってことありません? 自分はこの流れでDBに複雑な処理を置かなくなりました。

          DBに処理任せないでも実行速度で困らない程度の実装しかしてないんでしょうか?幸せなんですね。

          話の流れを考えると「DBに処理を任せないと実行速度で困る」という問題領域を持ち出すのが適切なのか疑問が残ります。

          そういうシビアな領域でORMが選択されるとは思えません。このストーリーの対象となる実装は、少なくともORMを適用することができる程度にはリソースに余裕があり、ORMを使わないという選択肢がパフォーマンス以外の理由で検討される場合のことだと思います。

          そして、元のコメントは、そういう場合に、ORMを使えるけど使わないという選択をする理由としてそれなりに説得力があると思います。

          --
          LIVE-GON(リベゴン)
          親コメント
        • by Anonymous Coward
          >なんで商用RDBがあんな複雑な処理ができるのか え?バージョンアップして金を取るためのネタでしょう?
    • by Anonymous Coward

      なるほど。日本でこの手の議論をしてる人って商用DBか、
      OSSでもPostgreSQLを使ってる人が多くて、VIEWくらい常識という印象を受けたので、
      議論がかみ合わないわけですね。

      煽った言い方をすると、あっちの人たちって低レベルな議論してるんですねと。

    • by Anonymous Coward

      社内独自実装のORMを使っていますが、大きな処理はストプロで出来るように
      ストプロをキックする仕組みは追加で実装されました。
      VIEWもロジックをDB側に任せる手段として使いますね。

      要は、全部の処理をDBに任せないで
      ・少量/逐次的なデータ処理→DB外
      ・大量のデータ操作→DB内
      と切り分けることが大事だと経験的に感じています。

      # BASICからアセンブラをちょこちょこ混ぜながら作る時の感覚ですかね

  • by heipoh (39873) on 2011年06月22日 12時06分 (#1974446)

    簡易なSELECT、INSERT、UPDATEはORMで。
    それ以外はSQLで書きましょう。

    ということのできないORMライブラリや、JOINまでORMで解決しないと
    気が済まないリーダーが混乱させているのだと思う。

    ・DBを隠ぺいしようなんて考えちゃだめ。
    ・ORMは簡単な処理をいちいちSQLで書かなくて良い、くらいにしとくこと。
    ・大体、オブジェクトに値を入れるのが面倒で使ってるんだから!
     という人は結果セットをオブジェクトに自動で入れる関数でも作ればいい。
    ・複数テーブルを連結する集計が多かったり画面表示のバリエーションが多いなら、
        いっそのことBeanなんてやめちまえ。画面表示でアクセサが必要ならば、汎用BeanのAPIを一度お試しあれ。
    ・PHPみたいなLLでORMする意味は無い。ハッシュを渡して使える便利SELECT/INSERT/UPDATE関数があればいい。

  • 以前、サイボウズがオブジェクトデータベースという、
    激遅いデータベースを作っていたので、文句を言ったら
    MySQL に乗り換えた、という事件がありました。
    まだ、これよりは、ましかと。
  • クエリーの二次元表化はともかく、レコードの変更や挿入はせっかくのトランザクション機構がうまく生かせないしローカルに変更結果を保持してると値を失うわでTableの直接マップは避けてたなぁ
  • by Anonymous Coward on 2011年06月21日 10時37分 (#1973629)

    どれも使ったことなくて記事での紹介やブログだけの印象ですが、

    Hibernate: 最悪。間違いなくアンチパターン。
    ActiveRecord: RoRが使える領域に限れば問題ないと思う。
    Doctrine: 全く知らない

    あとMyBatisとかS2DaoとかSQLを活かすフレームワークはこのパターンに当てはまらないような感じですね。

    なので、実質的にはHibernate = アンチパターンだと思います。

    • by Anonymous Coward

      > どれも使ったことなくて
      それがすべてを物語ってるんじゃないの?

      • パターンは無理して適合させる必要はないので、機会がなければ使わない。
        よって、有効なパターンは数あれど、使ったことのあるパターンは数パターンってのはよくある話。

        アンチパターンだと判断できるのは、要求とマッチして、使った事がある人だけ。
        • Re: (スコア:0, 荒らし)

          by Anonymous Coward

          じゃあ使ったこともないのにHibernateをあそこまでdisってる
          親コメントはどっちにしても支離滅裂なわけだ

          • by Anonymous Coward
            「どれも使ったことなくて記事での紹介やブログだけの印象ですが」って書いてあるから使ってないけどdisってんだろ?
      • by Anonymous Coward

        挙げてるものを使ったことがないだけで、ORM自体使ったことないわけじゃないですよ。
        Hibernateはちょっと検索してみれば分かるけど、あまりに酷いというコメントばかりで、
        使わなくても想像するだけでこりゃおかしいなと分かります。

        • by sumeshi0206 (12305) on 2011年06月21日 12時24分 (#1973719) 日記

          「おかしい」とか抽象的な事書くからおかしなコメントがでてくるわけで。

          自分がHibernateちょっと使って思ったのが、使い方覚えるのに時間がかかりそうということです。
          SQL書けない人でも使えるか又は、SQL直接書くより楽じゃなければORマッピングツール使う意味なんて無いわけだけど、Hibernateにはどちらも当てはまらないと思いました。(Hibernateバリバリ使いこなせるようになれば違うんだろうけど)

          コメントが沢山あるのは、ORマッピングツールとして世に出てきたのが最初の頃だったからかと思います。

          その点、S2Daoは現実的に使えると感じます。

          親コメのアンチパターンかどうかは自分にはわかりませんが、もっと良いパターンあるのでしょうか?(今より工数かからず安全に作れるパターン)

          親コメント
          • ゴメンなさい。リンク先読まずに書きました。勘違い。
            親コメント
          • by Anonymous Coward

            マッピングツールという名前がそもそも詐欺的。結局SQLを発行している以上SQLのパフォーマンスを超えられるはずがないわけで、ラッピングツールとでも言うべき。
            NoSQLみたいなDBMSを直接操作できるようなツールなら話は別だろうけどもはや関係データベースにマッピングしてないし。

          • by Anonymous Coward

            一応こちらにもコメント。

            > SQL書けない人でも使えるか
            これが破綻してると思います。

            まず、ORMの一番の問題はパフォーマンスが出ないことで、
            SQLを使うように変えたら何倍~何十倍も速くなることはざら。SQLが不要ということはないです。
            本当に最小限のプロジェクトなら問題ないとしても、
            そのためにJava + Hibernateというのが重すぎます。(なのでRoRは否定してない)

            次に、中でどんなSQLを発行してるのか分かりにくいことです。
            無駄なSQLを発行してパフォーマンスが落ちたり、Lazy/Eagerローディングの問題があったり。
            一方、生のSQLは単独で実行できるので、デバッグもしやすく、パ

            • by Anonymous Coward

              > 次に、中でどんなSQLを発行してるのか分かりにくいことです。
              C/C++/アセンブラ使いが他の高級言語に対して抱く感想そっくりなのが面白い。
              でも「DBMSのオプティマイザがどんな機械語コードに展開するかわかったもんじゃないからSQLなんか信用できん」と言ってるC/C++使いは見たことないなあ。不思議だ

              • by Anonymous Coward

                ・遅くなる問題の質が違う。例えばJavaだとせいぜい無駄なコードが入るくらいだけど(ただしGC問題除く)、
                 Lazy/Eagerの「N+1検索問題」は本質的に別のロジックが動く。
                 http://s2container.seasar.org/2.4/ja/s2jdbc_abstract.html# [seasar.org]トラブリにくい

                ・元コメに書いてあるけど、抽象化でむしろ開発効率が落ちるという大きな問題がある。

                似てるようで全然違いますね。

              • by Anonymous Coward
                ヒント句山盛りにしてSQLチューニングしたり、実行計画が勝手に変わらないようにロックしたりとか普通にするけど?
        • by Anonymous Coward

          >あまりに酷いというコメントばかり
          なんでそれだけコメントがいっぱいあるのか。
          ってところが鍵かも。

          あとどこがひどいのか理解せずにヒドイっていうのもヒドイかと。
          # javaはポインタが無いからヒドイ。ってよく言われてたな・・・

          • by Anonymous Coward
            Hibernateは使ったことがあるけど、
            Eclipseのpluginを使った開発環境込で考えれば、
            アドホックな開発用途で使う分には、十分アリだと思うけど?
            • by Anonymous Coward

              元記事では、
              > 当初は有益だが、長期的にみると良い結果以上の悪い結果を招く。
              なので、アドホックには使えるというよりは、アドホックにしか使えないということ。

          • by Anonymous Coward

            古いですけどこんなのとか。
            http://www.tsuyukimakoto.com/blog/2005/09/23/145/ [tsuyukimakoto.com]
            今この問題解決してるなら教えてくださいw

            • by Anonymous Coward
              リンク先の『hibernateを利用してはいけない5つのシチュエーション』を見ましたが、
              シチュエーション1、2、4は解決済みですよね。
              3、5はHibernateでなくてもORマッパを使っている限り同じ問題が発生するのでは?
              どちらにしろ、使い方を間違っている可能性が大きいと思います。

              別にHibernateを擁護する気はないですが、
              批判だけして代替案を提示しない姿勢には賛成できませんね。
              • by Anonymous Coward

                > どちらにしろ、使い方を間違っている可能性が大きいと思います。
                これは「バッドノウハウ」ですね。
                普通に使ってて使い方を間違っていると言われるのは設計が間違っているパターンがほとんどですよ。

                > 別にHibernateを擁護する気はないですが、
                > 批判だけして代替案を提示しない姿勢には賛成できませんね。
                他の書き込みでいくらでも代替案は書いてますよ。
                例えばJavaならもっと薄いSQLを生かしたフレームワークを使えばいいだけ。

            • by Anonymous Coward
              当時からさんざん突っ込まれてますが。
              http://d.hatena.ne.jp/koichik/touch/20051007/1128711612
  • by Anonymous Coward on 2011年06月21日 14時04分 (#1973843)
    私は django に付属している ORM を日常的に使っています。ソースにもあるように、抽象化が不完全というのは体感しています。そのため、ときおり SQL を直接記述する場面があります。しかし、私は完全な抽象化を期待しておらず、開発効率が向上しているのに満足しているので、アンチパターンとまでは思っていません。ORM がデータベースに関連するコードの8割程度の面倒を見てくれればそれでよく、ORM では不都合または無理なところだけ SQL を書くということで納得しています。

    とはいえ、ORM を使った場合、オブジェクト指向らしいデータ構造の設計と、RDBMS らしいデータ構造の設計を両立させることができずにいるため、常に気持ち悪さを抱えながら設計していることも事実です。私が感じる気持ち悪さは、たぶん下記のような理由から来ているように思います。

    RDBMSではデータを正規化によって細分化していき、別々のテーブルに分けて格納するようにします。これに対し、オブジェクト指向では、関連するデータを一箇所にまとめてカプセル化し、インタフェースを決めて細部を外部から隠蔽していこうとします。

    まとめようとする考え方と、分けようとする考え方のはざまで実際のデータ構造を決めることになるから、どちらか一方から見たら中途半端な考え方になっているのだと思います。みなさんは、オブジェクト指向らしいデータ構造と RDBMS らしいデータ構造の本質的な不一致ってどこだと思います?
typodupeerror

ソースを見ろ -- ある4桁UID

読み込み中...