【ノウ】DBアプリ開発ノウハウ【ハウ】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG・似たようなSQLがあっちこっちのプログラムで出て来るんだけど…
・Viewとかストアドとか、みんながポンポン作っちゃって収拾付かないよ〜。
・分かりやすく長すぎないテーブル項目名のつけかたは?
・見やすい帳票レイアウトって? 入力しやすい画面遷移って?
などなど、悩むところはみんな一緒。
DBアプリ開発のノウハウを語るスレッドです。
0002(^-^*
NGNG0003デフォルトの名無しさん
NGNG俺も、今からまさにDB連携作成に入るところ
0004デフォルトの名無しさん
NGNG>Viewとかストアドとか、みんながポンポン作っちゃって
ってのは、開発上の取り決めが無いのが問題なだけだと思われ。
0005デフォルトの名無しさん
NGNG「SQLをコード内に埋め込むと汚くなってしまう」の
実例をお願いします。いままで、Pro*CやVBで、DBを
使用したアプリケーションを開発してきたが、この例に
ぶち当たった経験がないものですから。
汚いテーブル設計はいやというほど目の当たりにしてきたが。
0006デフォルトの名無しさん
NGNGWebObjectsをやってみるとわかるかも
0007
NGNG0008デフォルトの名無しさん
NGNGhttp://doomo.org/cgi-bin/bbs1/za.cgi
0009デフォルトの名無しさん
NGNG全てがストアドプロシジャとして実装できればハッピーですが、
実際にはダイナミックにSQL文字列を作成しなければならない場合も
あったりして。
個人的には複雑な検索条件でWhere節(区)なんぞを動的生成したりする
事が多いですが、みなさんはどうしてます?
00105
NGNGもちろん、プログラムから動的にSQLを
生成するのが基本。select句にしても、
select 以降、すべて条件によって
変化する。
ストアドプロシージャを使う局面は
ごく限られる。
...と思っていたが、それって、醜い
のか?(汗)
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG基本的にはそれを使ってもいいと思うけど、
クエリーが少ない場合はベタの方がいいかも。
0013デフォルトの名無しさん
NGNG0014デフォルトの名無しさん
NGNG列名に型を表すprefixつけるとやり易い
って、基本か(w
0015データベース男
NGNGアクセルするにはODBCとかでやってるんですか?
0016デフォルトの名無しさん
NGNG0018デフォルトの名無しさん
NGNGやっている人はいないのかな?
0019デフォルトの名無しさん
NGNG普通はやらないと思われ。
というか、そういうレベルの話をするスレなのか?
0020デフォルトの名無しさん
NGNGストアド化する、って手法は普通でしょうか?
0021デフォルトの名無しさん
NGNGなんでもかんでもってのはやりすぎかも、でも多言語での開発を行う場合、例えば
入出力系はVB、DelphiなどのWindowsクライアントで、照会系はJava、PHPなどで
Webブラウザを使用ということになると、DB操作の一元化って事で、なんでもストアド
ってアプローチもいいんじゃないかな。
でも、その辺を突き詰めると、きちんとMVCに分けてAppServerを立てるって話に
なっちゃうね。
002220
NGNG多言語での開発ってのを考慮すると確かに有効ですね。
参考になります。
0023デフォルトの名無しさん
NGNGGUIレベルの機能として必要なところには使ってるな。
一覧から選択する画面のフィルタとかね。
0024デフォルトの名無しさん
NGNGいまのところ
・とりあえず英語表記
・テーブル名はカテゴリに合わせてプリフィクスを付ける(台帳:ADM、マスター:Mとか)
くらいでやってるけど、実際どーなんでせうか。
英語表記を使うとSQLの予約語とかぶる罠
0025デフォルトの名無しさん
NGNG英語で名前をつけると、1テーブルのフィールド数が500とかなるとキツイ。
500個すべて英語にするのも、辞書引いてもわからないのも多い。
仮にローマ字表記でも、500はちょっと.・・・。
そういう場合、24はどうしてるんだ?
0026デフォルトの名無しさん
NGNG1テーブルに500フィールドって一体…
0027デフォルトの名無しさん
NGNG002825
NGNGしたいのはやまやま。
しかし、人事データでの場合単なるデータの羅列で、それくらいの情報はある。
また、レガシーなシステムを捨てられない辛さもある。
002924
NGNGSヨが
「Accessだと256?以上フィールド増やせないからOracleにしる!」
とかいってOracleになりましたが、なにか?
正規化すればせいぜい1テーブル50フィールドくらいにしかならないがなー。
0030デフォルトの名無しさん
NGNG0031デフォルトの名無しさん
NGNG立場的につらいなぁ。過去のがからむと。
俺も人事やったことあるけど、やっぱり項目数が多かった。
しかも正規化できないやつ。
それより、論点ずれてきてるから戻さない?
テーブル、フィールド名の名前の付け方に。
項目数が多いのも考慮に入れて。
003231
NGNG0033デフォルトの名無しさん
NGNGやるんじゃなかった(T_T)
0034デフォルトの名無しさん
NGNG0035デフォルトの名無しさん
NGNGjavaとかでありがちなfirstNameとかとあわせづらい。
FIRST_NAMEとか、first_nameってつけた方が良い?
0036デフォルトの名無しさん
NGNGJavaなんかつかってるからだ。
003725
NGNG0038デフォルトの名無しさん
NGNG1か(w
0040デフォルトの名無しさん
NGNGつらいよねー。
結果、英語表記だとアンダーバー多用してしまうし・・・
0041デフォルトの名無しさん
NGNG使わずに、大文字小文字混合みたい。
FirstNameやfirstNameとか。
0042デフォルトの名無しさん
NGNG自分はとりあえずここで調べてるけど
ニュアンスあってるのか不安
ttp://member.nifty.ne.jp/eijiro/
0043デフォルトの名無しさん
NGNGADOのFilter使ったほうがトラフィック&速度的に
良さそうなんだけど、そういう目的では使わないの?
0044デフォルトの名無しさん
NGNG漏れはExcite
ttp://eiwa.excite.co.jp/
で、大文字小文字がないせいか、下手に省略するとわけわかんなくなる傾向が。
だいたい何文字くらいまでが適正なんだろ?
0045デフォルトの名無しさん
NGNG製造会社:Manufacturer
製造番号:Manufacturer_Serial_Number
-> Manu_No
とかってなんかいい書き方ない?
と書いてる最中にmakerにしたほうがいいのに気づく罠
0046デフォルトの名無しさん
NGNG列名に型を表すprefixつける
って基本なのか?
みんなそうなの?
違うと言ってくれ。
0047デフォルトの名無しさん
NGNG型が変わったときのことを考えると背筋が寒くなるのでやらない。
やったとしても、文字か数値か日付かってぐらい?
0048デフォルトの名無しさん
NGNGそうだよね。あるある。
結局英語ネイティブから見れば、こちらが苦労して辞書引きながら
やっても、おかしく見える場合って結構あると思う。
よって自分の場合はあきらめて、ローマ字表記で書いてる。
0049デフォルトの名無しさん
NGNG潔くTM0010,TM0020,TM0030...
005018
NGNGメモリ馬鹿食いするんで、多数のセッションをはるWEBアプリなんか
で使うと大変なことになります。
つーか、場にそぐわない話しなんでやめます。
>>48
ローマ時表記は個人的には嫌い。
「し」とか「おー」とかを表記するときに2通りあるんで結構困る。
0051デフォルトの名無しさん
NGNG>>48
ローマ字は英語表記のできない専門用語とかにしか使わないなー。
理由は>>50の通り。
つか、「日本語ふつーにつかうよ」つー人がでてこないのが珍しい。
>>49
メモリマップ見てる気分になってくるからイヤソ
0052デフォルトの名無しさん
NGNGわかりやすいし、見やすいし、コーヂングも仕様書作りも、すげー便利。
問題あると言う人もいるけど最近はもう大丈夫でしょう。
0053デフォルトの名無しさん
NGNG0054デフォルトの名無しさん
NGNGまだなんとも言えないけど。
0055デフォルトの名無しさん
NGNGそれを気にしないうちの上司、もう阿呆かと莫迦かと
0056デフォルトの名無しさん
NGNG文字コードの違うプラットフォームから叩こうとした場合に、寝ているバグを
起こしそうでちょっとコワイ。
0057デフォルトの名無しさん
NGNGキャッシュが効かなくて無駄だらけなんだけどもよ。
0058デフォルトの名無しさん
NGNGパラメータ付きクエリーってjavaのPreparedStatementのこと?
005952
NGNG確かになんらかのリスクがあるのはわかるのですが、
でるのかでないのかわからない不具合に備えるより
日本語を使うメリットのほうが大きいと勝手に
思ってそうしている。
さすがに機種依存文字は論外。
2バイト文字の記号も避けて
第一水準だけ使う。
文字コードが違う場合は列名どころの話では済まない
あらかじめ複数の文字コードに完全対応するのはあきらめ
ましょう。
ていうか俺はあきらめてる。
0060デフォルトの名無しさん
NGNG> あらかじめ複数の文字コードに完全対応するのはあきらめ
> ましょう。
で、のちのちシステムを拡張したり、
別のDBやOSに移行しようとして嵌る罠。
006157
NGNGjavaしらんけどたぶんそれ。
以前分業してやったWEBアプリ、WHERE句とかsprintfでべた書きされて手萎えたんでな。
あまりにもアクセスが閑散としてたWEBなんで黙ってたけどな。
0062デフォルトの名無しさん
NGNGエスケープされないからねぇ。
0063デフォルトの名無しさん
NGNG0064デフォルトの名無しさん
NGNGパスワードを ' OR 'a'='a
っていれられたら終わりってのもあるらしい。
0065デフォルトの名無しさん
NGNGああいうcgiつくる馬鹿も馬鹿だが
そんなものを検証せずに受け取っちゃう方も受け取っちゃう方だなあ
0066デフォルトの名無しさん
NGNGINSERT 文に ストアドプロシージャを使うメリットって何ですか?
普通にSQL文書く場合:
sql = "INSERT INTO TABLE_A VALUES('" + strA + "'," + int1 + ",'" + strB + ............."')";
ストアド使う場合:
sql = "Execute InsertTableA '" + strA + "'," + int1 + ",'" + strB + ....................."')";
コードはストアドにしてもあんまりすっきりしないような・・・。
直前にDELETE文走らせることができるくらい。
なんか俺間違ってます...よね?
0067デフォルトの名無しさん
NGNGINSERT INTO ... SELECT とかするときは、多分すっきりするよね
でもあんまり使う機会ないな・・・。
0068デフォルトの名無しさん
NGNG統一されたコーディングになるというメリットはあるかも。
0069デフォルトの名無しさん
NGNGすでに同一キーがないかどうかチェックしたり、各フィールドの妥当性検査したり
他のテーブル更新したり…いろいろあるじゃん。
なにより、すべてのInsertがストアドになってるほうが、プログラムのあちこちに
似たようなSQLが埋め込まれるより安心でしょ?
すっきりしないのはどうしようもない。ような気がする。
関数化すれば多少はすっきりすると思われ。
0070デフォルトの名無しさん
NGNG内容のストアドを各テーブル分吐いてくれるってツールもあるよ。
0071デフォルトの名無しさん
NGNGjdbcなら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すべての項目について部分一致検索を行いたいのですが、
Oracleはこのような検索には弱いようで、検索結果が表示されるまで
数分以上掛かってしまいます。
ところが検索結果を待てる時間はせいぜい10秒程度という要求がなされています。
(Notesの旧システムはその位のパフォーマンスが出ていた)
Oracle InterMedia TEXTという全文検索エンジンを導入すると、劇的に
改善されるという情報もありましたが、これは金銭の問題により導入は困難です。
当面の代替策として、Oracleへのアクセスを行っているWEBサーバの中に、
件の巨大テーブルと同じ構造・データを保持したMDBを配置し、
全文検索はそちらから行うようにしているのですが、それでも
検索に1分程は掛かってしまいます。
なにか安上がりで現実的な、良い代替策をご存知の方はおられますか?
0074デフォルトの名無しさん
NGNGテーブルの更新をトリガーにしてテーブル各行の主キーをファイル名として
各フィールドの中身を丸々コピーしたテキストファイルを吐き出しておき
それを全文検索エンジン(Namazuとか)に喰わせるのはいかがですか?
ファイル名=主キーですから、そこからさらにテーブルをSELECTすることも可能です。
・検索用ファイルの件数、容量が丸々テーブルと同じだけの件数、容量が必要なこと
・検索エンジン用のインデックスを作るのがバッチ処理になってしまうこと
上記2点がクリア出来れば実用十分な検索速度が得られると思います。
0075デフォルトの名無しさん
NGNGKWIC検索みたいのを考えてみなさい。
インデックス用のテーブルを別に持つ以外手はないだろう。
0076デフォルトの名無しさん
NGNGケコーンしてるクセに随分偉そうだな。ガッコの先生にでもなったつもりか?
>>74の方がよっぽど的確で親切じゃねーか。
0077デフォルトの名無しさん
NGNGおまえらロックはどうやってますか?
参照・蓄積系はそんな問題にならないだろうけど、
更新系C/Sとかだと結構悩むところだと思うのだが、どーだろ?
漏れは来た仕様が悲観ロックばっかりなんで
そのまま実装しておしまいだが。
0078デフォルトの名無しさん
NGNGお祈り系。
(クライアントが極めて少数で且つ同時に参照している事が運用場無い)
0079デフォルトの名無しさん
NGNGこれ最強。
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNGなんとか手綱が握れるだろう。
お祈りはダメ。
0082デフォルトの名無しさん
NGNG0083デフォルトの名無しさん
NGNG0084デフォルトの名無しさん
NGNG排他ロックのことだYO!
つまり、誰かがSelectしたら、読み取ることができない。
0085デフォルトの名無しさん
NGNGいわゆる排他(といわずともなんかしらの方法で同時更新させない)
ような*動作*をさせるときに行ロックとかを使わない方法ってある?
あるとすればどうやるんでしょ?
思いつくのは更新要求を非同期に扱うくらいだけど
それだと即時更新できなくなっちゃうし。
あとはワーク用テーブルとかも思いつきそうだけどデータの矛盾がおこりそうだし。
実務でバリバリやってる方多そうなんでノウハウぷりーず。
0086デフォルトの名無しさん
NGNGいまOracleでやってて仕様が排他的動作なんで
SELECT〜FOR UPDATE使ってやろうと思ってたんだが
うちのSヨから「行ロックなんて普通使いませんがなにか?」
っていわれたもんで悩んでおります。
(わりに解決方法は提示してこない)
結局ケース倍ケースなんだろうけど実際どーなの?
0088デフォルトの名無しさん
NGNGいや使う。
結構使う。
テーブルごとロックした方がいい場合もあるけど競合を抑えられそうなときは行ロックを使う。
使うんだが、そのSヨはよくしらんのか、たまたまその業務でつかわんでいいのか、
三回くらいリトライして交信中に矛盾が生じたためあきらめましたごめんメッセージが出るのか、
それともたまに謎のデッドロックするのかのどれかだろう。
行ロックの行数が増えると自動的にテーブルロックに格上げすんのってHiRDBだっけ?UDBだっけ?
008986
NGNGなるほろ。
やっぱロックしないとなると更新できないケースが出てしまうってことなのかな。
で、前にちょっとかじった情報によると、最新のSQLServerは
ロックの量?によって行 > ページ > テーブルロックとなるらしい?
だれかつっこみよろしく。
0090デフォルトの名無しさん
NGNG必ずしも使うわけではないと思うよ。
行ロックがないものもあるわけだし。
それでかなりクリティカルなものをやっているところもあるみたい。
DBが違えば、そこら辺の考え方はコロコロ変わってしまうしね。
今使っているDBの考え方から他のDBを評価するやつも多いしね。
0091デフォルトの名無しさん
NGNGそうそう、SQL Serverの機能だ。
行->ページテーブルでよいはず。
>>90
行ロックがないのはISAMから派生してきたやつじゃねえの?
普通の商用RDBだと、最近のバージョンのは大体持ってるけどな。(効率がよいか悪いかは別で)
必ずしも使うわけでないのは同意。
しないで済むならしないのが一番だ。
>>最後の二行
DBがちがうから考え方が違うんじゃない。
異なるコンセプトで設計されてるから、DBを選ぶべきなんだ。
前にも書いたがOracleしかしらんベンダは逝ってよし。
業務ごとにDBの向き、不向きを考えろ。
009286
NGNG> 異なるコンセプトで設計されてるから、DBを選ぶべきなんだ。
> 前にも書いたがOracleしかしらんベンダは逝ってよし。
> 業務ごとにDBの向き、不向きを考えろ。
なんかズシンときた!
印刷してSヨに見せてもよかですか?
と言ってみるてst
009390
NGNGありがとう。舌足らずだった。
その通り。
0094デフォルトの名無しさん
NGNGで、どうもMSは排他を捨てて共有ロックにしろって言ってるYO!
0095
NGNG0096デフォルトの名無しさん
NGNG>いわゆる排他(といわずともなんかしらの方法で同時更新させない)
>ような*動作*をさせるときに行ロックとかを使わない方法ってある?
俺がよくやるのは各行にカウンタを持たせるやり方。
最初は0で更新するたびにインクリメントする。
更新するときにSELECTしたときのカウンタの値とその時点での本当の値を
比べてもし違ってたらエラーにする。
これがちゃんと働くためにはC/S構造をきちんとして、更新を
一箇所だけに制限しないと駄目だからあまり役に立たないかも。
0097デフォルトの名無しさん
NGNG0098デフォルトの名無しさん
NGNG悲観的ロック、楽観的ロック、
行ロック、ページロック、テーブルロック
を整理した方がいいかも。
009973です
NGNGNamazu試してみました。ストアドプロシージャでCSV吐き出してる時に
原因不明のライトエラーを起こして4000ファイル位しか作れませんでしたが、
確かに検索は驚異的に早いですね。ありがとうございます。
問題なのは、やはり検索用ファイルの管理(テーブルに更新かかるたびに
毎回Namazuのインデックスも更新しなければならない等)、あと
あるカタカナの単語が含まれた文章が、その単語の最後の1文字が欠けた文字列で
検索かけてもヒットかった事があるのが厄介ですね。
こういうのは確実に回避する方法はあるのでしょうか?
>>75
全文検索エンジン導入がやはり最善かと思うのですが、まず金銭的な問題がありまして…
(Oracle8iなら無償で導入できるらしいのですが、8なんですよね。)
>KWIC検索みたいのを考えてみなさい。
>インデックス用のテーブルを別に持つ以外手はないだろう。
KWIC検索の実態がよくわからないのですが、興味深いので、もしよろしければ
もう少し詳しく教えて頂けないでしょうか?
0100デフォルトの名無しさん
NGNG中間一致・後方一致検索に強いインデックス作成法だ。
^^に対して
中間一致・中間・一致・後方一致検索・後方一致・後方・一致検索・一致・検索・強い・インデックス・作成法・作成でそれぞれインデックスを作る。
文中のどこを切って索引にするかは、作り次第。
どっかの国語辞書や専門用語辞典を取り込んで、それを元に索引を作ってもよい。
0101デフォルトの名無しさん
NGNGこのスレと直接関係ないかもしれんが
おまえらER図作るのにどんなソフト使ってますか?
ネームバリューからいくとVisioなのかな〜。
いまだったらUML関係(Rationalとか)使う手もあるな。
ちなみに漏れはExcel + Wordで手書きですがなにか?
■ このスレッドは過去ログ倉庫に格納されています