トップページ⇒tech
906コメント323KB

【ノウ】DBアプリ開発ノウハウ【ハウ】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
・SQL文をコード内に埋め込むとコードが汚くなっちゃう。うまく分ける方法無い?
・似たようなSQLがあっちこっちのプログラムで出て来るんだけど…
・Viewとかストアドとか、みんながポンポン作っちゃって収拾付かないよ〜。
・分かりやすく長すぎないテーブル項目名のつけかたは?
・見やすい帳票レイアウトって? 入力しやすい画面遷移って?

などなど、悩むところはみんな一緒。
DBアプリ開発のノウハウを語るスレッドです。
0002(^-^*NGNG
良スレの予感
0003デフォルトの名無しさんNGNG
応援するYO!
俺も、今からまさにDB連携作成に入るところ
0004デフォルトの名無しさんNGNG
>1
>Viewとかストアドとか、みんながポンポン作っちゃって

ってのは、開発上の取り決めが無いのが問題なだけだと思われ。
0005デフォルトの名無しさんNGNG
>>1
「SQLをコード内に埋め込むと汚くなってしまう」の
実例をお願いします。いままで、Pro*CやVBで、DBを
使用したアプリケーションを開発してきたが、この例に
ぶち当たった経験がないものですから。

汚いテーブル設計はいやというほど目の当たりにしてきたが。
0006デフォルトの名無しさんNGNG
>>5
WebObjectsをやってみるとわかるかも
0007 NGNG
C#でストアドが作れるらしい。次のSQLサーバでは。
0008デフォルトの名無しさんNGNG
(・∀・) こういった話題は、こっちの板でどうぞ。
http://doomo.org/cgi-bin/bbs1/za.cgi
0009デフォルトの名無しさんNGNG
>>5
全てがストアドプロシジャとして実装できればハッピーですが、
実際にはダイナミックにSQL文字列を作成しなければならない場合も
あったりして。
個人的には複雑な検索条件でWhere節(区)なんぞを動的生成したりする
事が多いですが、みなさんはどうしてます?
00105NGNG
>>9
もちろん、プログラムから動的にSQLを
生成するのが基本。select句にしても、
select 以降、すべて条件によって
変化する。

ストアドプロシージャを使う局面は
ごく限られる。

...と思っていたが、それって、醜い
のか?(汗)
0011デフォルトの名無しさんNGNG
難しいよね
0012デフォルトの名無しさんNGNG
>>10
基本的にはそれを使ってもいいと思うけど、
クエリーが少ない場合はベタの方がいいかも。
0013デフォルトの名無しさんNGNG
SQL文自動生成の良いクラスってないの?
0014デフォルトの名無しさんNGNG
まぁ、なんでも使いようです。

列名に型を表すprefixつけるとやり易い
って、基本か(w
0015データベース男NGNG
DBアプリって何言語で作ってますの?
アクセルするにはODBCとかでやってるんですか?
0016デフォルトの名無しさんNGNG
ストアド内で動的SQLを駆使してコーディングすれば良いのでは?
0017_NGNG
>>16
そのトウリデス。
パーフォーマンすをかんがえたら、
ストアド以外使用するべからず。
0018デフォルトの名無しさんNGNG
ADOのレコードセットでフィルターをかますって事を
やっている人はいないのかな?
0019デフォルトの名無しさんNGNG
>>18
普通はやらないと思われ。

というか、そういうレベルの話をするスレなのか?
0020デフォルトの名無しさんNGNG
基本的なDBとのやりとり(SELECT/INSERT/UPDATE/DELETE)は
ストアド化する、って手法は普通でしょうか?
0021デフォルトの名無しさんNGNG
>>20
なんでもかんでもってのはやりすぎかも、でも多言語での開発を行う場合、例えば
入出力系はVB、DelphiなどのWindowsクライアントで、照会系はJava、PHPなどで
Webブラウザを使用ということになると、DB操作の一元化って事で、なんでもストアド
ってアプローチもいいんじゃないかな。
でも、その辺を突き詰めると、きちんとMVCに分けてAppServerを立てるって話に
なっちゃうね。
002220NGNG
>21
多言語での開発ってのを考慮すると確かに有効ですね。
参考になります。
0023デフォルトの名無しさんNGNG
>>18
GUIレベルの機能として必要なところには使ってるな。
一覧から選択する画面のフィルタとかね。
0024デフォルトの名無しさんNGNG
いいテーブル、フィールド名の付け方ってどんなの?
いまのところ
 ・とりあえず英語表記
 ・テーブル名はカテゴリに合わせてプリフィクスを付ける(台帳:ADM、マスター:Mとか)
くらいでやってるけど、実際どーなんでせうか。


英語表記を使うとSQLの予約語とかぶる罠
0025デフォルトの名無しさんNGNG
>>24

英語で名前をつけると、1テーブルのフィールド数が500とかなるとキツイ。
500個すべて英語にするのも、辞書引いてもわからないのも多い。
仮にローマ字表記でも、500はちょっと.・・・。

そういう場合、24はどうしてるんだ?
0026デフォルトの名無しさんNGNG
>>25
1テーブルに500フィールドって一体…
0027デフォルトの名無しさんNGNG
テーブルの正規化しろよ
002825NGNG
>>27

したいのはやまやま。
しかし、人事データでの場合単なるデータの羅列で、それくらいの情報はある。
また、レガシーなシステムを捨てられない辛さもある。



002924NGNG
今作ってるアプリもともとAccessだったが
Sヨが
「Accessだと256?以上フィールド増やせないからOracleにしる!」
とかいってOracleになりましたが、なにか?

正規化すればせいぜい1テーブル50フィールドくらいにしかならないがなー。
0030デフォルトの名無しさんNGNG
お約束かもしらんけど、テーブル名は「T01」とか頭につけるなぁ。
0031デフォルトの名無しさんNGNG
>>25
立場的につらいなぁ。過去のがからむと。
俺も人事やったことあるけど、やっぱり項目数が多かった。
しかも正規化できないやつ。

それより、論点ずれてきてるから戻さない?
テーブル、フィールド名の名前の付け方に。
項目数が多いのも考慮に入れて。
003231NGNG
戻ってた。ごめん。
0033デフォルトの名無しさんNGNG
VBでリソース使ってSQLは全部そっちに記述するようにしてみたが...
やるんじゃなかった(T_T)
0034デフォルトの名無しさんNGNG
フィールド名は頭に'_'をつける。
0035デフォルトの名無しさんNGNG
SQLって大文字小文字を区別しないからつらくない?
javaとかでありがちなfirstNameとかとあわせづらい。
FIRST_NAMEとか、first_nameってつけた方が良い?
0036デフォルトの名無しさんNGNG
>>35
Javaなんかつかってるからだ。
003725NGNG
Javaだけの問題でないと思われ・・・
0038デフォルトの名無しさんNGNG
粘着がいるね。
1か(w
00391NGNG
>>38
おいら>>21しか書いてない。
そういうノリやめよ。だれも粘着なんかしてないしさ。
0040デフォルトの名無しさんNGNG
>>35
つらいよねー。
結果、英語表記だとアンダーバー多用してしまうし・・・
0041デフォルトの名無しさんNGNG
ちょっと調べてみたけど、.NET、Relaxerなどのサンプルは、アンダーバーを
使わずに、大文字小文字混合みたい。
FirstNameやfirstNameとか。
0042デフォルトの名無しさんNGNG
みんな英語のカラム名どうやって付けてる?
自分はとりあえずここで調べてるけど
ニュアンスあってるのか不安
ttp://member.nifty.ne.jp/eijiro/
0043デフォルトの名無しさんNGNG
>>18
ADOのFilter使ったほうがトラフィック&速度的に
良さそうなんだけど、そういう目的では使わないの?
0044デフォルトの名無しさんNGNG
>>42
漏れはExcite
ttp://eiwa.excite.co.jp/

で、大文字小文字がないせいか、下手に省略するとわけわかんなくなる傾向が。
だいたい何文字くらいまでが適正なんだろ?
0045デフォルトの名無しさんNGNG
たとえば

製造会社:Manufacturer
製造番号:Manufacturer_Serial_Number
  -> Manu_No
とかってなんかいい書き方ない?


と書いてる最中にmakerにしたほうがいいのに気づく罠
0046デフォルトの名無しさんNGNG
>>14
列名に型を表すprefixつける
って基本なのか?
みんなそうなの?
違うと言ってくれ。
0047デフォルトの名無しさんNGNG
>>46
型が変わったときのことを考えると背筋が寒くなるのでやらない。
やったとしても、文字か数値か日付かってぐらい?
0048デフォルトの名無しさんNGNG
>>45
そうだよね。あるある。
結局英語ネイティブから見れば、こちらが苦労して辞書引きながら
やっても、おかしく見える場合って結構あると思う。
よって自分の場合はあきらめて、ローマ字表記で書いてる。
0049デフォルトの名無しさんNGNG
>>48
潔くTM0010,TM0020,TM0030...
005018NGNG
>>43
メモリ馬鹿食いするんで、多数のセッションをはるWEBアプリなんか
で使うと大変なことになります。
つーか、場にそぐわない話しなんでやめます。

>>48
ローマ時表記は個人的には嫌い。
「し」とか「おー」とかを表記するときに2通りあるんで結構困る。
0051デフォルトの名無しさんNGNG
あんまりもりあがらないスレだな(w

>>48
ローマ字は英語表記のできない専門用語とかにしか使わないなー。
理由は>>50の通り。
つか、「日本語ふつーにつかうよ」つー人がでてこないのが珍しい。

>>49
メモリマップ見てる気分になってくるからイヤソ
0052デフォルトの名無しさんNGNG
日本語ふつーにつかうよ。プレフィックス英字+日本語列名
わかりやすいし、見やすいし、コーヂングも仕様書作りも、すげー便利。
問題あると言う人もいるけど最近はもう大丈夫でしょう。

0053デフォルトの名無しさんNGNG
最初はくそスレけていと思ったけど、よくなってんじゃん。
0054デフォルトの名無しさんNGNG
なんかSQL鯖2kで日本語フィールド名絡みと思われる不具合が...
まだなんとも言えないけど。
0055デフォルトの名無しさんNGNG
機種依存文字使うと強制[ ]になるね
それを気にしないうちの上司、もう阿呆かと莫迦かと
0056デフォルトの名無しさんNGNG
>>52
文字コードの違うプラットフォームから叩こうとした場合に、寝ているバグを
起こしそうでちょっとコワイ。
0057デフォルトの名無しさんNGNG
お前らきちんとパラメータ付きクエリー使ってっか?
キャッシュが効かなくて無駄だらけなんだけどもよ。
0058デフォルトの名無しさんNGNG
>>57
パラメータ付きクエリーってjavaのPreparedStatementのこと?
005952NGNG

確かになんらかのリスクがあるのはわかるのですが、
でるのかでないのかわからない不具合に備えるより
日本語を使うメリットのほうが大きいと勝手に
思ってそうしている。

さすがに機種依存文字は論外。
2バイト文字の記号も避けて
第一水準だけ使う。
文字コードが違う場合は列名どころの話では済まない
あらかじめ複数の文字コードに完全対応するのはあきらめ
ましょう。
ていうか俺はあきらめてる。
0060デフォルトの名無しさんNGNG
> 文字コードが違う場合は列名どころの話では済まない
> あらかじめ複数の文字コードに完全対応するのはあきらめ
> ましょう。

で、のちのちシステムを拡張したり、
別のDBやOSに移行しようとして嵌る罠。

006157NGNG
>>58
javaしらんけどたぶんそれ。

以前分業してやったWEBアプリ、WHERE句とかsprintfでべた書きされて手萎えたんでな。
あまりにもアクセスが閑散としてたWEBなんで黙ってたけどな。
0062デフォルトの名無しさんNGNG
sql文を単純にsprintfでやるとエスケープされるべき文字列が
エスケープされないからねぇ。
0063デフォルトの名無しさんNGNG
cgiに'を食わせると狂うサイトのいかに多いことか..
0064デフォルトの名無しさんNGNG
IDとパスワードを要求するフォームで
パスワードを ' OR 'a'='a
っていれられたら終わりってのもあるらしい。
0065デフォルトの名無しさんNGNG
ありがちだのお。

ああいうcgiつくる馬鹿も馬鹿だが
そんなものを検証せずに受け取っちゃう方も受け取っちゃう方だなあ
0066デフォルトの名無しさんNGNG
ヘタヘタレです。教えてください。

INSERT 文に ストアドプロシージャを使うメリットって何ですか?

普通にSQL文書く場合:
sql = "INSERT INTO TABLE_A VALUES('" + strA + "'," + int1 + ",'" + strB + ............."')";

ストアド使う場合:
sql = "Execute InsertTableA '" + strA + "'," + int1 + ",'" + strB + ....................."')";


コードはストアドにしてもあんまりすっきりしないような・・・。
直前にDELETE文走らせることができるくらい。
なんか俺間違ってます...よね?
0067デフォルトの名無しさんNGNG
あああ、なんかバカまるだしだ・・・。鬱。

INSERT INTO ... SELECT とかするときは、多分すっきりするよね
でもあんまり使う機会ないな・・・。
0068デフォルトの名無しさんNGNG
「INSERT時はこれを使う」と決めることで、
統一されたコーディングになるというメリットはあるかも。
0069デフォルトの名無しさんNGNG
>>66
すでに同一キーがないかどうかチェックしたり、各フィールドの妥当性検査したり
他のテーブル更新したり…いろいろあるじゃん。
なにより、すべてのInsertがストアドになってるほうが、プログラムのあちこちに
似たようなSQLが埋め込まれるより安心でしょ?

すっきりしないのはどうしようもない。ような気がする。
関数化すれば多少はすっきりすると思われ。
0070デフォルトの名無しさんNGNG
データベースの定義を入力すると、>69が書いているような
内容のストアドを各テーブル分吐いてくれるってツールもあるよ。
0071デフォルトの名無しさんNGNG
>>66 クライアントはCやC++ですか?
jdbcならprepardStatement、MSならadoやodbc等
普通パラメータを名前付きバインド変数として使いませんか?
(jdbcには名前付きパラメータってあったかな...)

仮想的な例ですが、
SPject sp = SPObject( "InsertTableA" );
sp.Prms["strA"] = "test";
sp.Prms["int1"] = 100;
sp.Prms["strB"] = "data";
sp.Execure() ...
0072デフォルトの名無しさんNGNG
みなさん、ありがとうございます。
もっと勉強してみます。

>>70
便利そうですね。探してみます。
でもうちのプロジェクトだと、フリーじゃないとだめそうっす。
>>71
JSP/Servletでやってます。
恥ずかしながらはじめて聞きました。
何も知らない新入社員として入社して、まもなく1年、
"普通"、"標準"という言葉に強い憧れを感じます。

Googleで Java バインド変数 でそれらしきものが
いくつかでてきたので、勉強してみます。
0073デフォルトの名無しさんNGNG
VARCHAR2(4000)などという項目が20列近く、レコードが数万件あるテーブルから
すべての項目について部分一致検索を行いたいのですが、
Oracleはこのような検索には弱いようで、検索結果が表示されるまで
数分以上掛かってしまいます。
ところが検索結果を待てる時間はせいぜい10秒程度という要求がなされています。
(Notesの旧システムはその位のパフォーマンスが出ていた)
Oracle InterMedia TEXTという全文検索エンジンを導入すると、劇的に
改善されるという情報もありましたが、これは金銭の問題により導入は困難です。

当面の代替策として、Oracleへのアクセスを行っているWEBサーバの中に、
件の巨大テーブルと同じ構造・データを保持したMDBを配置し、
全文検索はそちらから行うようにしているのですが、それでも
検索に1分程は掛かってしまいます。

なにか安上がりで現実的な、良い代替策をご存知の方はおられますか?
0074デフォルトの名無しさんNGNG
>>73
テーブルの更新をトリガーにしてテーブル各行の主キーをファイル名として
各フィールドの中身を丸々コピーしたテキストファイルを吐き出しておき
それを全文検索エンジン(Namazuとか)に喰わせるのはいかがですか?
ファイル名=主キーですから、そこからさらにテーブルをSELECTすることも可能です。

・検索用ファイルの件数、容量が丸々テーブルと同じだけの件数、容量が必要なこと
・検索エンジン用のインデックスを作るのがバッチ処理になってしまうこと
上記2点がクリア出来れば実用十分な検索速度が得られると思います。
0075デフォルトの名無しさんNGNG
全文検索エンジンをつかうか
KWIC検索みたいのを考えてみなさい。

インデックス用のテーブルを別に持つ以外手はないだろう。
0076デフォルトの名無しさんNGNG
>>75
ケコーンしてるクセに随分偉そうだな。ガッコの先生にでもなったつもりか?
>>74の方がよっぽど的確で親切じゃねーか。
0077デフォルトの名無しさんNGNG
他スレで思いついたのだが
おまえらロックはどうやってますか?

参照・蓄積系はそんな問題にならないだろうけど、
更新系C/Sとかだと結構悩むところだと思うのだが、どーだろ?

漏れは来た仕様が悲観ロックばっかりなんで
そのまま実装しておしまいだが。
0078デフォルトの名無しさんNGNG
>>77
お祈り系。
(クライアントが極めて少数で且つ同時に参照している事が運用場無い)
0079デフォルトの名無しさんNGNG
更新は夜間バッチ。
これ最強。
0080デフォルトの名無しさんNGNG
更新系でも建家が違ったりした場合に、悲観で死んだ。
0081デフォルトの名無しさんNGNG
クライアントからはストアドしかみせないようにしとけば、
なんとか手綱が握れるだろう。
お祈りはダメ。

0082デフォルトの名無しさんNGNG
悲観ロックって何?
0083デフォルトの名無しさんNGNG
やばそうな床とりあえずロック?
0084デフォルトの名無しさんNGNG
>>82
排他ロックのことだYO!

つまり、誰かがSelectしたら、読み取ることができない。
0085デフォルトの名無しさんNGNG
漏れRDBMSの経験あんまないんで聞きたいのだが
いわゆる排他(といわずともなんかしらの方法で同時更新させない)
ような*動作*をさせるときに行ロックとかを使わない方法ってある?
あるとすればどうやるんでしょ?

思いつくのは更新要求を非同期に扱うくらいだけど
それだと即時更新できなくなっちゃうし。
あとはワーク用テーブルとかも思いつきそうだけどデータの矛盾がおこりそうだし。

実務でバリバリやってる方多そうなんでノウハウぷりーず。
0086デフォルトの名無しさんNGNG
追記。
いまOracleでやってて仕様が排他的動作なんで
SELECT〜FOR UPDATE使ってやろうと思ってたんだが
うちのSヨから「行ロックなんて普通使いませんがなにか?」
っていわれたもんで悩んでおります。
(わりに解決方法は提示してこない)

結局ケース倍ケースなんだろうけど実際どーなの?
008782NGNG
>>83
>>84
ありがとっす。
そうゆうのやったことないっす。
0088デフォルトの名無しさんNGNG
>>86
いや使う。
結構使う。
テーブルごとロックした方がいい場合もあるけど競合を抑えられそうなときは行ロックを使う。

使うんだが、そのSヨはよくしらんのか、たまたまその業務でつかわんでいいのか、
三回くらいリトライして交信中に矛盾が生じたためあきらめましたごめんメッセージが出るのか、
それともたまに謎のデッドロックするのかのどれかだろう。

行ロックの行数が増えると自動的にテーブルロックに格上げすんのってHiRDBだっけ?UDBだっけ?
008986NGNG
>>88
なるほろ。
やっぱロックしないとなると更新できないケースが出てしまうってことなのかな。

で、前にちょっとかじった情報によると、最新のSQLServerは
ロックの量?によって行 > ページ > テーブルロックとなるらしい?


だれかつっこみよろしく。
0090デフォルトの名無しさんNGNG
>>88
必ずしも使うわけではないと思うよ。
行ロックがないものもあるわけだし。
それでかなりクリティカルなものをやっているところもあるみたい。

DBが違えば、そこら辺の考え方はコロコロ変わってしまうしね。
今使っているDBの考え方から他のDBを評価するやつも多いしね。
0091デフォルトの名無しさんNGNG
>>89
そうそう、SQL Serverの機能だ。
行->ページテーブルでよいはず。

>>90
行ロックがないのはISAMから派生してきたやつじゃねえの?
普通の商用RDBだと、最近のバージョンのは大体持ってるけどな。(効率がよいか悪いかは別で)

必ずしも使うわけでないのは同意。
しないで済むならしないのが一番だ。

>>最後の二行
DBがちがうから考え方が違うんじゃない。
異なるコンセプトで設計されてるから、DBを選ぶべきなんだ。
前にも書いたがOracleしかしらんベンダは逝ってよし。
業務ごとにDBの向き、不向きを考えろ。
009286NGNG
>>91
> 異なるコンセプトで設計されてるから、DBを選ぶべきなんだ。
> 前にも書いたがOracleしかしらんベンダは逝ってよし。
> 業務ごとにDBの向き、不向きを考えろ。
なんかズシンときた!
印刷してSヨに見せてもよかですか?

と言ってみるてst
009390NGNG
>>92
ありがとう。舌足らずだった。
その通り。
0094デフォルトの名無しさんNGNG
SQL Serverには行ロックはあるけど排他+行ロックはないYO!
で、どうもMSは排他を捨てて共有ロックにしろって言ってるYO!
0095  NGNG
ADOとoo4oってどっち使ってまふか
0096デフォルトの名無しさんNGNG
>>85
>いわゆる排他(といわずともなんかしらの方法で同時更新させない)
>ような*動作*をさせるときに行ロックとかを使わない方法ってある?
俺がよくやるのは各行にカウンタを持たせるやり方。
最初は0で更新するたびにインクリメントする。
更新するときにSELECTしたときのカウンタの値とその時点での本当の値を
比べてもし違ってたらエラーにする。

これがちゃんと働くためにはC/S構造をきちんとして、更新を
一箇所だけに制限しないと駄目だからあまり役に立たないかも。
0097デフォルトの名無しさんNGNG
(´д`;;)
0098デフォルトの名無しさんNGNG
共有ロック、排他ロック、
悲観的ロック、楽観的ロック、
行ロック、ページロック、テーブルロック
を整理した方がいいかも。
009973ですNGNG
>>74
Namazu試してみました。ストアドプロシージャでCSV吐き出してる時に
原因不明のライトエラーを起こして4000ファイル位しか作れませんでしたが、
確かに検索は驚異的に早いですね。ありがとうございます。
問題なのは、やはり検索用ファイルの管理(テーブルに更新かかるたびに
毎回Namazuのインデックスも更新しなければならない等)、あと
あるカタカナの単語が含まれた文章が、その単語の最後の1文字が欠けた文字列で
検索かけてもヒットかった事があるのが厄介ですね。
こういうのは確実に回避する方法はあるのでしょうか?

>>75
全文検索エンジン導入がやはり最善かと思うのですが、まず金銭的な問題がありまして…
(Oracle8iなら無償で導入できるらしいのですが、8なんですよね。)
>KWIC検索みたいのを考えてみなさい。
>インデックス用のテーブルを別に持つ以外手はないだろう。
KWIC検索の実態がよくわからないのですが、興味深いので、もしよろしければ
もう少し詳しく教えて頂けないでしょうか?
0100デフォルトの名無しさんNGNG
ググれ。ばかもの。

中間一致・後方一致検索に強いインデックス作成法だ。

^^に対して
中間一致・中間・一致・後方一致検索・後方一致・後方・一致検索・一致・検索・強い・インデックス・作成法・作成でそれぞれインデックスを作る。
文中のどこを切って索引にするかは、作り次第。
どっかの国語辞書や専門用語辞典を取り込んで、それを元に索引を作ってもよい。
0101デフォルトの名無しさんNGNG
収束してない話題が多いがどんどん議題提供しる!

このスレと直接関係ないかもしれんが
おまえらER図作るのにどんなソフト使ってますか?

ネームバリューからいくとVisioなのかな〜。
いまだったらUML関係(Rationalとか)使う手もあるな。


ちなみに漏れはExcel + Wordで手書きですがなにか?
■ このスレッドは過去ログ倉庫に格納されています