愛車:マツダアテンザ
Webを中心とした、ビジネス&テクノロジーに関する思いつき
by F-shin
[ このサイトについて ] [ F-shinについて ] [ トップ ]
author:えふしん
photo_20.jpg
藤川真一について


モバツイの中の人
人の良いジョンカビラと言われます。ソフト哲学者を目指します。
AMN sponsor rolls
応援します!
ツイッターやるなら
for iPhone App
Google Friend Connect
このカテゴリ[Web系]の最新30件
ワーナー作品のオンデマンド配信サービス「ワーナーオンデマンド」 動画ベーススライドプレゼンよりも、スライドベース動画プレゼンの方がWeb向き。 mixiアプリやるならAmazon EC2 モバツイが月間1億PV到達の見通し ツイッターとはなんぞや?のわかりやすい回答 ツイッターか?ブログか?思考の整理学 【Best Mobile Based Twitter App】モバツイッターがTOP5にノミネートされました。投票のご協力を!【敵はtweetie2】 【Best Mobile Based Twitter App】モバツイッターのOpen Web Awardsへの投票のご協力をお願いします! モバツイッターが日経ビジネスアソシエに掲載されました。 ネットビジネスで商標は大事です。 twitterによって世界が集約され心の戦争が起きる おまとめマンxTwitterキャンペーン セカイカメラは、21世紀のネットスケープになるか?! 「食事中なう」が無意味だと?あれ?ライフログってなんだか意味わかってる? 岡田有花さんに取材された! EC2のロードバランサーのIPアドレスが変わる罠 twitterの「つぶやき」の有効期間は2分 究極のスモールスタートの方法 自宅サーバからEC2へ 技術や用語に興味ないユーザーを「一般ユーザー」と括るのキケン アマゾンEC2 ナイトセミナ 第 2 回に出演します。 モバツイッターの政治家アカウント一時サスペンドの話 【twitter話】ネットを使う人には2種類のタイプがある ビバ☆ヒウィッヒヒーは、ネットコミュニケーションの問題をズバリ突いている うっかりしてたらモバツイの延べ登録ユーザー数が10万人を超えていました。 POPitがカラメルの商品紹介&アフィリエイトに対応! twitterは「みんなのもの」じゃない。 入力フォームの美学と現実 日本人にとって一番使われてるハッシュタグ ツイッターはステートレスなコミュニケーションでありつづけて欲しい。 夜のプロトコル「NO_04「We love twitter & tumblr.」~あの娘、ぼくがリブログ決めたらどんな顔するだろう~」に参加した。
[このカテゴリをもっと見る]
F's Garage関連
Powered by
Movable Type
■お知らせ
モバツイッターが、Open Web AwardsのBest Mobile Based Twtter Appを受賞しました!

February 09, 2004

SQL嫌い論[Web系]

はぶにっきさんのO/Rマッピングの、

O/Rマッピング
>O/Rマッピングの議論の中で出てくるのが、RDBMSなんて本当はいらん!って話です。
>でも、何かそれって良く見ると、単にSQLが嫌いなだけのようにも見えるんです。気のせいですか?

元々は、DBのテーブルをJavaのクラスにマッピングしちゃって、SQLを自動生成しましょう!というのを作ろう!と言ってる議論のハナシだと予想していますが、僕はあくまで部外者ですが・・・

はーい。僕は、SQL書くの嫌いな人です!!!!と思わず、手を挙げたくなったりしました(笑)

この発想って、WebObjectsとか、最近だとADO.NETあたりから来てるんだと思いますが(Jakartaにもありますよね?あの辺、名前覚えられん。)、実は、僕も初めてJ2EEを始めたときに、オブジェクト指向~いいねぇ~と、まずやったのが、いわゆるO/Rマッピング(一般的にそう言うんですか?)・・・のクラスを作ることでした。基本的に「セマンティックな構文を作るためのソースコードを、人間様の手で書くのはめんどくさい」人で、実際に、作るときに「SQL書くの嫌いなもんで~」という言い訳として始めた仕組みだったので、ことのほか反応してしまいました。

僕の場合、発想は極めてシンプルで、SQLを作るためのソースコードって冗長だし、「’」とか「、」のつけ忘れをデバッグするのが嫌いだったから自動化したという低レベルな発想だったりします。沢山カラムがあるInsert文のデバッグで、あれーどんなSQL文になったのかなぁ?って、秀丸にコピーして改行入れるとかが、すごく嫌だったもので。

自動化するわけですから、ある程度DBの自由度を奪うのは致し方ないですが、自分ところのは複雑なデータ構造はViewで吸収するいう現状ですね。単純にテーブルを単一のBeanで囲いこむだけでは、きっと物足りないと思います。

経験的にたどり着いたのは、テーブルの構造とJavaのクラスは必ずしも1:1にならず、データを引っ張ってくる時と、DBに書き込む時では使うBeanが変わっていたりします。当然、SELECTするときはViewのクラスで、保存するときは個々のテーブルにマッピングされたクラスです。特に一覧画面を作るときに、無駄なDBへのアクセスを減らすという意味では、仕方ないことであります。

~~~この辺は、このエントリに興味持っていただける方々には釈迦に説法なんだろうなぁとは思いますが、気にしても仕方ないので、続けまーす。

クラス構造は、あまり深追いすると小難しくなる割に自由度がなくなるので、Where句の後ろは、足したければ自由に足せるようになっているぐらいのシンプルな構造にしてます。

これ、SQLインジェクション対策としては品質管理的にテストだけじゃなくて目視検査が必須だったりと、微妙に不満ではありますが、副問い合わせをしなくちゃいけないときに、このクラスが使えないというのだけは避けたかったし、そこまでの構造を考えてる時間がなかったので。

ソースコード検査は、Eclipseで該当メソッド検索して、Where句に放り込む値は、SQL用のエンコードメソッド通さないとダメよ~んとルール決めしておけば、チェックするのは、そんなに大変ではありません。

*SQLインジェクションとは、ログイン認証のIDやパスワードのフィールドに、SQL文として騙すことができる文字を入力することで、認証処理をごまかしてログインしたり、DBのデータを書き換えてしまえるハッキング技。適切な文字列チェックや変換をしていないことで発生する人的不具合。

基本的なフレームワークの発想は、8割楽して、2割はマニュアル化しておいて自由度を残し構造をシンプルに・・・という感じでしょうか。多分、Jakartaなど、みんなで作るプロダクトというのは、とにかくフレームワークとして完成させるために、複雑になったり制約をつけざるを得ない部分もあるんでしょうかね。あくまで想像ですが。

でもSQLは自由度高いので、SQLの野望を完全に汲み取るとJava側が不幸にならざるを得ないんじゃないでしょうかね?確かに、そりゃまぁJava側の都合で富豪的プログラミングにならざるを得ない部分もあって、チャキチャキのDBエンジニアには我慢ならないところもあるだろうなぁとは認識はしています。

その他、コネクションを閉じ忘れられたときに、最悪の事態にならないように、安全に開放されるようにフレームワーク化してもらいました。コネクションのクローズがありやなしやというのはチェックするのは大変なのでありがたいことです。

ーーーーー

JavaとDBの境界線ですが、例えばSELECTタグの選択候補に出すような定数的なマスタデータってDBに持たせますか?
マスタデータがDBに必要であるなら仕方ないですが、僕は、こんなヘリクツを考えていたりします。

・マスタデータによる入力値の制約がJavaクラスの設計で保証されてるなら、DBでリレーションを張る必要はないのでは?
・最終的にマスタデータを使うのがJSPなどでのプレゼン層に限られるなら、一々DBから値を引っ張ってくる処理が無駄では?動的に変更可能な定数をXMLとかリソースファイルで持って、それをJavaレイヤーで扱う方が楽だし、データベース接続のコストがかからず経済的では?

などという観点から、定数クラスにマスタデータを持つのですが、データベースに慣れている人からは割と驚かれてしまいます。つまり、データ設計をデータベースの範囲でのみを考えて設計すると、この辺の考え方は意味不明なわけです。Javaクラスと両方同時に設計すると、こうなるのが自然じゃないかな?と思うわけですね。

つまりJavaというプログラム言語が、クラス構造により、ある一定の制約を作れるのなら、データベースのレイヤーまでその制限を持っていく必要はなく、「ハイパワーなデータストア手段」としてデータベースを扱いたくなる気持ちはわかります。もちろん最終的には適材適所になるのですが、いずれにせよ、DBとJavaはできるだけ疎結合にしたい!そのためにSQL文は極力外側のクラスに追いやるのがベターではないでしょうか?と。

実際、元の議論を見てないので勝手に展開してますが、ホント、単純に「SQL嫌い」というキーワードだけに反応したエントリということで、まったく他意はありませんので、ご容赦ください。(そういう意味では、丸々レスっぽくなってしまってるのに、トラックバックがつけられないのが申し訳ないです。)

でも、その次は、XMLのマッピングも同じクラス使ってやりたくなりますよね。そうすれば、Flash Remotingとかなくても楽できるじゃないですか?・・・と。このネタって元々、SOAPがまだVBのツールキットしかなかったときに、ActiveXDLLでXMLのRPCをするために思いついたネタなので、僕としてはそっちの発想の方がネイティブではあるのですが。VBのSOAPツールキットが激しく難しく、むかついて、これなら自分でXMLをハンドリングした方が確実に速いと思って、そのままDBに保存するために考えたネタでして。今なら、XML-RPCで汎用ライブラリと組み合わせて、あちこちにデータ回せますしね。

■同じカテゴリ[Web系]のエントリー
<<前の記事 ブラウザ対応の話
>>次の記事 そろそろ安全なECサイトを作れる開発者向けフレームワークを。
■このblogの書き込み最新3件
グッドデザイン賞に出てたおしゃれなサイクロン掃除機がなんと半額以下。 SEOには、運用のSEOと設計のSEOの2つのフェーズがある。 ワーナー作品のオンデマンド配信サービス「ワーナーオンデマンド」