変数とDBへの値の格納の差について。
珍しくついったーのログから。
- showyou
- RDBと連携したプログラム作ってる方に質問。RDBとデータやりとりするときって、一回一回sqlのクエリを発行する関数を呼び出してるんでしょうか?
- ryoju
- @showyou hibernateとかのORMを使うとか、ADO.NETみたいなDAOを使うとかあるよ
- showyou
- @ryoju なるほど、hibernateってそういうツールだったのか。
- t2y
- @showyou 使用する言語や DBI を書いた方が答えやすい? DBI モジュールに依存しない?
- showyou
- 個人的には変数に値突っ込むのと似た感覚でデータベース更新させろっていいたい。(もちろん変数突っ込む度にRDB問い合わせするのは大変なのでその辺はプロキシなり一段かますのだろうけど)
- showyou
- 例えばa['hoge'] = x;とかやったら、勝手にSQLでhogeのものを探してそこにxを入れるとか
- YurineMashiro
- @showyou そのあたりライブラリで隠蔽するとかすると実現できるんですかね。
- t2y
- @showyou 私は VB + plsql か、Ruby + DBI か、C の埋め込み SQL しか使ったことがないけれど、その手の手法は分からないな。
- ryoju
- @showyou それがORMだと思うよ。
- showyou
- @YurineMashiro 少なくともオペレータのオーバロードができるC++ならできるはず。
- t2y
- 適当に SQL を発行すると、大きなコストになる可能性があるので、明示的にインデックスや条件を考慮して引っ張り出すのが一般的?
- showyou
- @ryoju そうね、そんな感じがするわー。
- t2y
- 私は、数百万〜数千万件程度のテーブルからデータを抽出することを言っている。従って、扱うデータ量にも依るかもしれない。
- t2y
- 裏方で勝手に SQL を発行されたら、恐くてプログラム組めない。
- YurineMashiro
- @showyou あ、たしかに。そもそも演算子オーバーロードできないと無理ですね。
- showyou
- @t2y 書き込みに関しては、いったんメモリ上に貯めて、時間が来たらいっせいに書き込むとかしてあげればいいかと。
- t2y
- @showyou SQL のクエリを前もって裏方で発行しておいてメモリにストックしておくということ?
- showyou
- @t2y どっちかというと、プログラマがあまりSQLを意識しないで、ライブラリ側でうまく整理して読み書きするって感じです。
- showyou
- SQLを使ってますよって最初に宣言するのはあり。ただ、その後も延々とSQLのための構文を書いていくのはあまりにも非効率な気がする。どうして変数と同じように扱えないのか。
- t2y
- @showyou それは理想的なんでしょうけれど、遅かれ早かれパフォーマンスチューニングが必要になる日が訪れる気がします。
- showyou
- @t2y SQLのチューニングを、アプリケーション開発側が意識する必要あるんですかね?DBとの連携側が意識する部分な気が。
- hyoshiok
- @showyou update table set a=:x where a='hoge'; みたいな。
- hyoshiok
- RDBは集合に対する操作なんだから、挿入(insert)/削除(delete)/検索(select)を考えればいい。変数という概念はでてこない。
- hyoshiok
- RDBの更新(update)は集合の要素に対する変更。なので検索して変更する。
- showyou
- @hyoshiok 書き方がちょっとまずかったですね。私が言いたかったのは、listオブジェクトとRDBの操作の話でした。
- hyoshiok
- RDBMSの美しいところは論理構造と物理構造を意識して分離できるところ。
- showyou
- listオブジェクトなのだから、insert,delete,selectは存在する。で、なぜ同じ処理をするのに組み込みのlistオブジェクトを使うときとRDBMSを使うときで違う書き方をしなきゃいけないのさ。
- t2y
- @showyou そこが私もとても悩ましいところだと思っています < SQL チューニング
- t2y
- 誰かの講演で、「DB とは何ぞや?」との定義を、「超グローバル変数だ」と言った人がいました。
- t2y
- 変数だと考えると、それはプログラマが意識して、データ構造を把握して、プログラミングすべき。
- t2y
- けれど、「DB は DB 屋さんに」と考えると、また別問題に思えてしまう。
- t2y
- 「データ構造とアルゴリズム」と言うように、データ構造を把握していないとは、本当はプログラムも組めないはずなんですね。これがパフォーマンス問題。
- hyoshiok
- SQL以外の言語はRDBの処理を念頭に置いていないから。だからミスマッチが起きる。
- showyou
- 私としてはhibernateとか、DIcontainerを使ってるとか言った人いるのかなぁっていう感じだったのだけど。他のWeb屋さんどうなんでしょう。皆さんSQL直書きなのかしら。
- t2y
- @showyou なるほど〜。私は pl/sql を呼び出すか、SQL を直書きしか知らないですね。何かそういう、便利な仕組みがあるのかな。
- showyou
- @t2y 有名なのはSeaserのS2containerあたりでしょうか。これもどのくらい使われてるのかわかりませんが・・
- showyou
- ただS2container自体私は使ったことがないので、これが自分の要望満たしてるものなのかどうかは厳密にはわかってないんですよねぇ。
- takano32
- @showyou Hibernateなんかよく使われてましたねぇ。最近EEのJava追ってないのでよくわかんないですが・・・
- takano32
- @t2y RubyならActiveRecord!!
- showyou
- @takano32 実際のWeb屋さんでどれだけHibernateやSeaser使われてるのかなーって思いまして。
- showyou
- この二つに限らず、DIcontainer全般がどれだけ考えられてるのか。
- takano32
- @showyou ボクがJavaで検索サイトを開発していたときは Struts( + StrutsIDE) + Hibernate でしたねー。あと、なんかタイル型のView使ってた。
- t2y
- @takano32 O/R マッパーとか、名前は聞くのだけど、未勉強。今後の課題。精進します〜。
注)DIcontainerはデータ非依存コンテナのこと。実際の意味はよく理解してないですが、格納する変数の型(整数、リスト)とか、格納先(メモリ、DB)とかを気にせず使える奴。これがいいかどうかは不明(SQL/コマンドインジェクションの問題が起きるだろうし)