データベースプログラミング全般スレ
■ このスレッドは過去ログ倉庫に格納されています
データベース板もあるが、あそこは過疎板だからこっちに立てました。 データベース関連のプログラミングならな〜んでもOK。 色んな話をしませまうる号。 >4 えー・・? なんであの不細工なI/Fが最強ナンデディスカー? >>1 板違いです。 過疎などというのは言い訳になりません。 データベース板 http://pc5.2ch.net/db/ 過疎じゃん。w それにまともなプログラミング関係無いから こっちでいいよ。 データベースプログラミングって、ぶっちゃけつまんなくない? データペースプログラミングなんて本当はやりたくない やってて楽しくない 作っててわくわくしない (いや〜なドキドキ感はあるが) しかしそれでもやらなきゃいけないのがプロのプログラマ DBデータをCSVで出力するプログラムに フィールドを一件追加する作業なんて最高だね! Oracleとかだと今のところまともなI/FがCOM/VBしかないなんて悲惨すぎる。 つーかプログラムから使うとなると、ODBCとか変な部分で敷居が高いんだよなあ。 SQL文発行させるまでが長いというか。 >>16 確かにつまらん。でも、今はこれが一番金になるのよね。 >>18 DB のデータを CSV で出力するのにどうしてプログラム書く必要があるんだ? DBMS 側にそういう機能がついてるものもあるし、なかったとしても ちょっと SQL 工夫すりゃすぐできるじゃん。 以下はPrologの中でSQL風の記述をした部分なのですが、 select (顧客番号,商品番号,出荷日,数量,金額) into X from 売上 where 出荷場所='東京支店' and 出荷日>='20041207', いかにも、SQL風ではありますが、Prologでは 論理式の and を "," で 表現していて、これが文法上の骨格になっており変更がむずかしい。 その結果、(顧客番号,商品番号,出荷日,数量,顧客番号)の 外側の括弧が外せず、既存のSQLの字面をそのままの形でPrologプログラムに 置き換えることができません。どなたか、 よいアイデアをお持ちの方いませんか。 過疎化してるだけならいいんだが、 アフォしか残ってないのが遺体 PostgreSQLとMySQLの違いを教えてください こんなプログラムできますか? javaを使ってIDというか会員制みたいなHPを作りたいんだけど・・ヤフー、Googleとかが IDとパスワードいれたらログインできたりするプログラムなんですが、プログラム辞典なんかで 調べたんだけど載ってないし・・・だれかわかる人いますか? >>30 あまりにもレベル高すぎてこの板の住人には無理だよ。 >>30 俺できるけど、総額が2京円くらいかかるよ QDBMを使っている人が居たら教えて下さい。 QDBMでは、1レコードに複数のデータを格納するには配列や自製データ型にして格納するしか無いんですか? でもそうだとすると取り出すときにあるレコードの一つの値だけを取り出す事が出来ませんよね。 データの格納位置のイメージはRDBMSのテーブルみたいな 複数フィールドを作って1レコードにフィールドごとの値を格納するという形ですよね? サンプルコードを読んでもチュートリアルを読んでも キー1つに値1つを関連付けてるものしか見当たらないんですが。 >>35 遅レスだが、、、 同一キーのレコードを複数入れたいのであれば、 BツリーのAPIを使えば可能だよ。カーソルも使える。 >>34 兆の次の単位を覚えたばっかりでうれしいんだろうけど、 低脳丸出しだから以降気をつけた方が良いよ >>38 そうですね。 2ヶ月前のレスにいちいちけちくせーこと言うことないもんね。 >>37 なるほど、確かにBツリーで出来ますね。 レスありがとうございました。 データベース関連の文書を読んでいて 「格納されるデータはスパースでない」と出てきたんだけど これは、例えば100バイト区切りで区切る事にして70バイトのデータも30バイトの空白データを入れて100バイトに調整する みたいな事はしていませんよ、って事ですか? C++ で O/R mapping できるライブラリでいいのない? 20個くらいしかテーブルがなかったので、自動生成に頼らずいちいち書いたよ… チンポウェア氏ね。 文書無さ杉で、構文一つ探すのにも苦労する。 >>45 DB板に専用スレがあって活発に書き込まれているじゃないかw QDBMのplusのサンプルコード、 書き込みとか読み込み処理で例外が発生した時にクローズされなくね? マニュアルにクローズの時にDBは更新されるとか書いてあったけど、 これは例外発生時は全処理をキャンセルするからクローズされなくても大丈夫、と言う事を意味してるのか? openと同じ数しかcloseかけないみたい(closeが多いとコンパイルエラーになる) だから例外処理中でクローズできないし サンプルコード通りに書くしか無さそうだけども 本当にこれで良いんだろうか? あぁ俺がアホだった。 マニュアルの一番上に書いてあった。 明示的に閉じない場合はインスタンス破棄時にデストラクタで閉じられるらしい。 DBMSでSQL文の構文解析をどのように行っているか知りたいのですが、 参考になる書籍、情報などご存知ないでしょうか。 とりあえずHSQLDBのソースコードを読み始めているのですが(まだ1時間ですけど) それらしい部分にすら辿りつけてません・・・ データベースの実装に関しての資料とかあまり見ないですね。 利用することに対しての資料は特定DBのものに関しては腐るほどあるのですが・・・。 もしよろしければ実装に関して何からの情報が書いてあるサイトとかありましたらよろしくお願いします。 これからCを学んでいこうと思うが、 一緒に勉強していく人・いろいろと親切に教えてくれる人集まれ。 使っているサイト http://www.cham.ne.jp/piro/ 他にもサイトがあったらどんどん教えて( ゚д゚)クレ みんなで頑張るのです。 RDMSの勉強を始めた高校生です。 テーブルの各行の一つのセルに、可変の数の配列要素を記述したいのですが、どうするのが一番自然なのでしょうか。 実行時に、各行のユニークなIDを元にそれぞれ別のテーブルを作ってもいいんですが、パフォーマンスが気になります。 もしくは "hoge1|hoge2|hoge3|..."というように何か区切り文字を入れて一つの文字列にしてもよい気もしますが、定石的な方法があれば教えていただきたいと思います。 よろしくお願いいたします。 >>54 正道なら別テーブル それが正規化 邪道ならデリミタつけて可変長文字列にブッコミ それがオレのジャスティス a|{b,c,d} という行を入れたいなら a|b a|c a|d という3行を入れる。それがRDB。 配列をサポートしたRDBMSを使うという手もあるが。 >>55 ありがとうございます。”正規化”という言葉を教えてもらって助かりました。 少し調べたところ、各行ごとに別表を作るのではなくて、全体で一つ、別に表を作ればいいわけですね。 データベースはツールとして使いたいだけだったので基本的なことも調べずにいたのが悪かったみたいです。 >>54 一冊、DBの本を読んでおくといい。 正規化の話は、おそらく1章か2章に書かれているはずだ。 最初は、ちょっととっつにくいが、特性をうまく生かせた時は楽しいぞ。 関係ないけど、O/Rマッピング楽しい。 >>59 作りたいWebアプリケーションがあって(えっと、まぁ、とってもしょぼいんですが)、背後でデータベースを使いたいと 思ってのことだったんですが、考えれば考えるほど、データベース構造の設計が一番重要だという気になってきました。 ユーザーインターフェイスや他の部分への設計にすごく影響があるという意味でですけど。 あと、データベースの構造って一旦データが入るとあとから変更できないんですね(?)。(僕はMSDEというフリーのDBを使っていますが これって普通のことなんですよね?)個人的には、開発の試行錯誤の最中だけでもいいので、構造を自由に変えられるととっても 便利だと思うんですけども。 データベースってそれ自体で結構面白いですね。おっしゃるとおり、まずは一冊ぐらい簡単な本を読んでみようと思います。 、、、といってまた本来の目的からすれば横道にそれていく自分がいてもどかしいです。 >>54 ヒント: ALTER TABLE コンバーターの自作も大した事ない。 dump して DROP DATABASE してから戻すのも簡単。 あとは、これでも読んでおけ。 http://www.rfs.jp/sitebuilder/sql/ もっと詳しい事は本買って DB板でもみとけ。 >>28 超遅レス DB使う理由 ・途中でロールバックできる ・キーを間違えなきゃ複数のテーブルのデータがちゃんと更新される ・複数のプログラムから更新かけてもデータが壊れない ・作ったプログラムがこけてもデータが破壊されない 再びすみません。本を一冊買って読み進めていますが並行して質問させてください、、、。 テーブルにデータををINSERTするときに、プライマリーキーが自動で割り振られるようにしています。 (具体的にはマイクロソフトのWebMatrixでテーブルを作るときにプライマリーキーのIsIdentity属性をtrueにしました。) このIDENTITYキーを再利用したいのですが可能でしょうか。 たとえば、DELETE句で"N"というIDを持っていた行を削除したとします。次の機会にINSERTでデータを追加する際に同じ"N"というキーを使うようにしたいのです。 無理、無駄、危険。 どうしてもやりたければ、「空いた番号」を覚えておくテーブルでも作れ。 >>64 「無理」なわけですね。。 最初はIDを自分で管理できないかとも思ったのですが、トランザクション(始めは考えてもいなかったのですが)のことなどを考え始めると大変そうだと思い、 だったらIDの管理はデータベースに任せておいて、単にIDを再利用できればいいと思ったのですけど。 >>62 ・ある程度以上のデータを扱うときにはCSVとかと比べて圧倒的に処理が早い これも追加してくれ ・プログラム毎のファイル形式の違いを完全に吸収する つうのは?。 DBを使う理由かぁ。それなりの本には必ず書いてあると思ったがなぁ。 使うのが当たり前過ぎて使う理由が見えにくいのかな。 使わないとどのような弊害が発生するかを想像するのが早道かも データベース触ったこと無くて、触るの怖いんだが、 途中で適当に項目や項目数増やしても、 プログラムほとんど替えずに動くの? csvだとデータバージョン管理とか、構造変更した時の弊害とか、 データ拡張時の未フォローデータの扱いとか、 すげー拡張時の事で、頭いっぱいで破裂しそうなのだが… >>66 「高速で便利なデータアクセス手段を提供する」ってことでいいんじゃないかな なにしろSQLは便利だし、複数のキーや条件が絡む高速な検索方式を手で 実装するのはめんどい。 >>67 UNIXの/etc/passwordみたいなレガシーなデータベース(ただのファイル) も、複数のプログラムからアクセスできる点では同じ。 ただし、データフォーマットはまちまちだが、現在はXMLのようなものもある。 それを「DBを使う理由」といってしまうのはどうか。 >>68 変えずに動く「場合もある」としか言えない 普通はもちろんデータ項目増やしたんならプログラムを変更する必要がある >>63 自己レスですが、IDENTITYを使うのはやめて、 SELECT MyID+1 FROM MyTable WHERE MyID+1 NOT IN (SELECT MyID FROM MyTable) とかクエリしてみて返された値を使って自分でIDを管理するようにしてみました。(いいんでしょうか?) >>71 その為のDEFAULT制約じゃないのか? >>72 ・同時アクセスが来たら衝突する ・IDごときでテーブルにあるか調べてたらとても遅い >>77 日本語がおかしいが、いわんとするところは キリのいい数字という意味だな。 256とか65536とかは魔法の数字だから 実態がどうであれ、推奨。 PostgreSQL始めたんですがどこから手をつけたもんやら困っています なにかいい書籍ないですか? まだPQsetdbLoginで接続してSQL投げて遊んでる段階です 普通のPGと、SQLも含めたDB屋って違うからな。 SQLをDB毎に最適化できるPGがそもそもあんまりいない。 DBできますってPGに作らせると、毎回DBから結果拾ってくるようなの書くし。 Web+DBだと更にWebデザも絡んでぐだぐだになるかPGが必死こいてHTML修正しまくるかに成る。 なんかいいの無いの? でもPostgresのソース見た感じ、RDBって中身はキャッシュ制御の塊じゃないの? 勉強中の奴にいっとくが 主キーの定義は一つのカラムに。 内容はユニークなだけで意味の無いものにしておけよ。 参考書に書いてても伝票番号、明細番号とかの複合キーにしないように。 >>81 DB屋が最適化した SQL投げる関数作って PG に渡す。 もちろん要相談。 勉強中の奴にいっとくが 主キーの定義は一つのカラムに。 内容はユニークなだけで意味の無いものにしておけよ。 参考書に書いてても伝票番号、明細番号とかの複合キーにしないように。 SQLなんて、DBを詳しく知らなくても素人が扱えるようにした簡易言語に過ぎない だろ。それに、きょうびサーバーならGB超のメモリを搭載しているんだし、たかだか 数十万件くらいのデータベースなんて、オンメモリでやれよな。 で、サーバー落ちたらすっぱりデータはあきらめる。 そういう人生もいいかもな。(w >>88 >SQLなんて、DBを詳しく知らなくても素人が扱えるようにした簡易言語に過ぎない 素晴らしいな。 DBのオペレーティング画面は違えど、標準SQLは、DBによらないし、選択、抽出、作成、挿入の操作をCUIでやってるだけだし、 具体的に言うと、ACCESSのGUIでコピー、フィルタ、入力、ペーストやってるのと変わらない。 >>92 ああ、そうだな。 いい子だからもう寝なさい ちなみに 88=92=95 なわけだが。 キティちゃんに認定してあげます。 96 = データベースがないと、データ処理ができないと本気で思っている プログラマ以下の半人前SE(自称コン猿) >>95 今MSはそういうことを考えているらしいぞ VBはもともとオラクルを扱うために生まれた言語ですよ ∧_∧ / ̄ ̄ ̄ ̄ ̄ (ω・ )ゝ < なんだって? ノ/ / \_____ ノ ̄ゝ DBの最適化命令って普通はどう突っ込む? 新しいデータが入ったと同時に実行されるようにするの? 時間で? >>97 個人でアプリ作ってるおばかさんにはDBなんて不要でしょうね。 ヒッキーは楽でいいですね >>91 まあ、>>92 , >>95 はともかく。 >>88 の「SQLなんて、DBを詳しく知らなくても素人が扱えるようにした簡易言 語に過ぎない」は、「素人が」と言うところに引っかかる奴はいるだろうがま あおおはずれと言うわけでもないだろ。 ビジネスロジックをバリバリ書くプログラマが全員データベース実装のプロと 言うわけじゃないから、データベース実装と言う分野ではある意味「素人」な んだからさ。 プログラマとデータベース設計(実装じゃないぞ)者を同一視してはいけないよ データベース実装は素人でもいいです でもトランザクションについてはしっかり身につけてほしいですね あ、トランザクションの使い方、じゃないですよ・・・ >86 それだけではないでしょ。 ユニークていうのが、あいまいで使いたくなくて、唯一つのものにするけど、 唯一つのものが、主キーだけである場合、インデックスに使えるのは主キーだけになってくるから、 その場合、中間部分に意味のあるものはだめ。 例えば、年月日時で各桁に意味を持たせた場合、月ごととか中間一致は検索できない。 この場合、分類コード項目を新たに作る必要がある。 これを意味のない連番と表現されているようだけど、これもあいまいだと思う。 年月入れる列って、日付型で1日固定として定義していい? 普通どうやる? 俺は一日固定。でもどうせ年月しか使わないんだから日にちはどうでも良いんだよな。 日時型ってyyyy/mm/dd hh:mm:ss? gYear, gMonth, gDay gYearMonth, gMonthDay durationってのもあるな イラネつったらいらんけど統一されるとありがたい 他人が使わなかったらあんまり意味無いけど >>106 書き方まずかったけど、>>105 のデータベース実装は、 データベースシステム自体の実装の話ね。例えばオラク ルで働いてるアーキテクトとかプログラマーとかのこと を言っている。データベースを使う人の話じゃないよ。 O/Rマッピングを勉強中の者です。 DataMapperに関しての質問なのですが、 安直な実装では、DataMapperは識別子を受け取りドメインオブジェクトを作って返すことになるかと思います。 ここで、仮にオブジェクトの全ての値を利用するわけではなく、(状況によって変化する) かつ、パフォーマンスを考慮して最低限のロードにとどめたい場合、 DataMapperにそのような特殊なオブジェクト(部分的にしかロードされていないオブジェクト)を返す責務を割り当てるべきなのでしょうか? ドメインロジックに依存しない、という観点から見ると、DataMapperにそのような関数を作るのは不適当な気がしますし、 オブジェクトはデータベースに依存していないので、必要に応じて適宜読み込むようなProxyの実装も不適当かと思います。 (まだ理解が浅いので全く見当違いのことを書いているかもしれません・・・) このような場合の解決策はどういったものになるのでしょうか。 ORマッピングが面倒だね。 GUIなんて弄りたくないのだが、楽にやる方法無いの? XMLなんてみんな使いやすいと思って弄ってるの? なんででーたべーす板って過疎ってるん? こっちに統合しちゃえよ。 一応、PL/SQLもプログラミング言語みたいだから、 こっちでもいいんじゃない? よくわからんがJavaならJDBC4.0で解決じゃね? JDBCの上にまともなフレームワーク使わないと大変ですよ。 C++からMySQL操作しているのですが、データベースの作成法を覚えていざデータベースを作ろうとすると、どう設計すればいいのかわかりませんでした。 下のような表をデータベースにしようとしてるのですが、 http://www1.mbrace.or.jp/od2/B/200609/b060914.lzh この表のデータをどういう風にテーブルに分割すればいいのか検討がつきません。 例を示していただけるとうれしいです。 正規化って難しいですね パズルのようで、プログラムとはちがった楽しさです 正規化ってやりすぎてもパフォーマンスに悪影響出るんだろ? セックルをやりすぎても彼女に嫌われるのと同じ。 程々にしとくのが一番いい。 なんかフィールドが50個ぐらいになっちゃったんだけど、50個は普通? テーブル名とかフィールト名って大文字? 小文字じゃだめかな。 >>130 小文字じゃダメなデータベースソフトじゃなければ、どっちでもいいだろ SQLとはちょっと違うのだが一つ質問。 プロセス間通信のかわりにデータベースをメッセージパッシングのためのキューとして使うのってなんか問題あるのかな? アプリ同士のメッセージ交換にActiveMQとかCORBAを使わずに簡単にできる方法としていいのかなと思うのだが。 そもそもデータベースってシステム内のスコープがものすごく広いグローバル変数だよな? >>133 まあ、問題ないと思うよ。 通常のDBのトランザクション系データ自体そうじゃない。 ある事象を記録して、次の事象を促すデータ。 >>133 メッセージングとデータ格納は別だと思うよ。 メッセージングをdbってのはあり得ないでしょ。 >>135 狭い範囲ではありえないかもしれないが、イベントの契機となるものを広義な意味でメッセージと解釈すればありうるでしょ。 たとえば、ネットワークゲームである地点の状況をDBに格納して、その値をプレーヤが処理がすればそれは一種のメッセージングだよね。 株価みたいなリアルタイムの値の処理もDBに突っ込んで証券各社でメッセージングしてるくらいだしなあ。 DBに格納されたことを伝える方法ってないよねえ トリガってどこまでできるんだろう MSDEつかいはじめたんですが、現在作成しているテーブルがどれだけあるか、また どんなものがあったかを調べるコマンドはあるのでしょうか? すいません、ちょっと質問させてください。 ODBC経由でAccessのデータベースに、データを連続で自動登録させていたんですが、 2万数千件を超えた辺りから急激にパフォーマンスが落ちました。その後も徐々に パフォーマンスが落ちて10万件登録するのにメチャメチャ時間が掛かります。 そこで聞きたいのですが、フツーにAccessってこのくらい件数が増えたら当り前に パフォーマンスが落ちるものなんでしょうか? 件数が多い場合は他のデータベースを使うほうが賢いのでしょうか? SQLite とか MySQL で試してみたら? DB が悪いのかクエリーとの相性が悪いのか切り分けられるから。 分かりました。試してみます。 ところでクエリーとの相性ってなんでしょう? 大量のデータを一括登録する時は、それ用のクエリーの書き方ってあるものじゃん。 い、一件ずつ登録していました・・・。 それようのクエリー、、調べてみます。 とりあえずMySQLで試してみたら、Accessのようなパフォーマンス低下はありませんでした。 データも10万件が一分かからずに登録完了です。 しかし、それようのクエリーがあるのなら無駄な処理をしているわけで、、。 解決した問題はそれとして、調べて一から作り直してみます。 教えてくれた人、ありがとう。 >>147 はい、テストのつもりで自動コミットモードでプログラムしていました。 もしかして自動コミットとAccessに何か悪い関係でも、、? どういう意味でしょう?? 大量のデータを一括登録するときはautocommitをOFFにしましょう。 ONだと10万回のcommitが発生します。 データの登録が完了=>一回commitで autocomitて表全体をLockするんじゃなかったっけ。 その場合、複数クライアントがいると・・・、あるいは、インデックス更新は時間が掛かる処理だから、 CREATE INDEXは後々バッチにまわすとか。 テーブルに導出項目(年齢を日付から計算させたり)があったりJOINが多かったりしても、パフォーマンスは悪化するけど、表全体ロックだと余計に。 一般的なRDBMSの話だと、先にステートメントを作って使い回すとかね。 亀レスですいませんでした。急に用事ができて出かけていたのでご容赦を。 >>149-150 言わるまで考えていませんでした。 でも、コミットって一回一回の処理ごとじゃなくてもできるんですね?知りませんでした。 10万件ものデータを一回でコミットできるんなら楽で良いですね。 それにロックがパフォーマンスを悪化させるのも初めて知って勉強になりました。 ありがとうございます! 確かSQLiteもトランザクション開かずに操作すると 毎回コミットするんだよな確か Cでデータベースを弄るのに便利なライブラリとかミドルウェアって無いの? こういうことってセキュリティ対策なので仕方ないのはわかるんですが、 修正に1500〜3000万もかかるもんなんでしょうか? ttp://www.sankei.co.jp/shakai/wadai/061209/wdi061209004.htm 住基ネット離脱に難題…1人削除すると「不正データ」に 住民基本台帳ネットワーク(住基ネット)からの個人の離脱を認めた大阪高裁 判決受け入れを決めた大阪府箕面市で、原告1人の住民票コードを削除すると、 約12万7000人のデータが入ったサーバーがダウンする恐れのあることが9日、分かった。 対応策には1500万−3000万円かかるといい、担当課は頭を抱えている。 市情報政策課によると、住基ネットは市から府のサーバーを経由して国にデータが 送られる。しかし、原告の女性を除いたデータの交信は国から不正アクセスと みなされ、市のサーバーがダウンする可能性があることが判明。削除できた場合でも、 原告を除く全市民のシステムを再構築するか、原告のデータだけ文書で管理する以外に道はないという。 高裁判決は大阪府の吹田、箕面、守口3市の計4人の離脱を認めたが、吹田、 守口市は上告を決定。箕面市の藤沢純一市長は7日、判決受け入れを表明したうえで、 具体的な削除の方法について「システムの専門家ではなく、よくわからない」としていた。 (2006/12/09 21:56) age忘れてました DB版は過疎ってるのでこちらで質問させて頂きました すみません >>155 >>こういうことってセキュリティ対策なので仕方ないのはわかるんですが いやいやいや・・・・・ まず普通にありえねぇだろwwwww 論理削除オンリーでデータが無限に増え続けていくシステムだぜ? ニュー速+のスレ見たがレベル低い話しか出てなくて驚いた (sql一発でできるだろ、に近いノリ) 全うな話はだれかがブログに書くんじゃね? IBMの社員が電球を取り替えるのにかかる人数は・・・ とかいうのに近い>1500万〜3000万 たとえば、家にある楽曲を管理して、検索するプログラムつくりたいんだが、JAVAがいいのか? なんかさ、環境ダウンロードするのがめんどくて。 Accessのファイルを読み込み、そこからテーブルを選択して グリッドに表示するプログラムを作っています。 とりあえず、動くものができたのですが1つだけテーブルを選択する 時にエラーになる現象を見つけました。 テーブル名の中に半角カッコ「()」が使われているテーブルで読み込みエラー になってしまいます。(全角カッコにすると問題なく読めます) 「テーブル名には半角カッコは使わないでくださいね」と言ってしまえばそれでいいような きもするのですが・・なんか悔しくて^^; これを回避するにはどうしたらよいでしょうか? 環境はボーランドC++Builder7とWinXpです SQLの「バックアップファイル」と「チェックポイントファイル」の違いとは何でしょうか? sql文をこねくりまわしてやっと実現した機能が 簡単なsql文とスクリプトで見易く速く出来たり ってよくあると思うけど、お前らどう? ケースバイケースだけど、なんとなく負けた気がするよな 誰に負けたか知らんけど sqlも勉強すれば良いだけだろ。 perlでやっとで出来た処理が、rubyだとさくっと出来たりするのはよくある話。 家にある楽曲程度なら、phpかrubyで作るのが漏れの趣味。 javaだとどのフレームワーク使うのが普通? みんな無料のjbossでがんばってるの? ウェブロジックとウェブスフィアのどちらがいい? MySQLにODBCドライバ入れて CやRubyやExcel/Wordからはアクセス出来るのですが なぜかAccessからはアクセス出来ません なにがいけないのでしょうか? >>173 versionとかわからんけど、マニュアルは読んで試したの? ttp://dev.mysql.com/doc/refman/4.1/ja/myodbc-clients.html >>172 仕事か趣味かしらんが、データベースがDB2ならWebSphereだろーなぁ。 別にDB2でJBOSSでもtomcatでもいいんだが。 ツリー型の掲示板つくってるんですが、1レスを1レコードって考えた場合 レス間の繋がりってどうやって表現するのが良いんでしょうか。 にレスの親子関係を別テーブル化。 create table (new_res, parent_res, タイムスタンプ) えーと、それが一番素直で使い勝手が良いとか考えたんだけど、 クエリ何度も飛ばすのは変だなぁ、って思いまして。 読込時の性能を上げるためにクエリ回数を減らしたいってことなら冗長なフォーマット済みデータを作る。 だけどそういった最適化は後で考えるようにして、まずは>>177 の通り実装してみれば良いと思うよ。 自分流のデータフォーマット考えて、自分でそれをいじるモジュール作って、自分の作品でそれを使うのが一番快感。 最近SQL Server(2005) の勉強始めたものです。 Localでの段階では成功していたのですが、いざネットワーク上の別パソコンへ という段階で、躓いております。 C#のWinFormプログラムでConnectionStringで接続して簡単なSQLを実行しようとしています。 するとWindows認証でログインしようとしたときに、guestでログインしようとしているようです。 (サーバ側でguestを無効にすると guestはログインできませんでした。みたいなエラーが出ます。) ConnectionString内にUser ID を設定しても変わりません。 ネットワークはワークグループベースなんですが、Windows認証ってドメインとか関係あるんでしょうか? こういう場合はSQL Server認証なんかでやった方がいいんでしょうか? どんな資料もWindows認証を推奨してるんでWindows認証でやろうと思っていたのですが。 もちろんサーバー側にユーザー登録はしております。(Windows、SQL Serverとも) 自己レス エクスプローラの表示オプションで「簡易ファイルの共有を使用する」のチェックを外す でした。orz SQL CLR って VS2005 スタンダードではできないの? それとも、テンプレートはないけどできるものなの? できるとしたら、めんどくささのレベルはどれくらい? どなたかやさしく教えて下さい。 昨日データベースの勉強をはじめて、 データベースは、たくさんのテーブルを入れる箱だというところまで分かりました。 中に保管するテーブルは、アプリケーションが異なろうが、クライアントが違おうが、 とにかく放り込んで行ってOKなんでしょうけ? レン鯖などだと、DB1個しか用意されてなかったりするので、 子供のオモチャ箱状態で運用して良いのか心配です。 > とにかく放り込んで行ってOKなんでしょうけ? その、放り込みする方法はアプリケーションやプログラムで違うんだが。 >>189 当分は1個で事足りるだろうから心配ないよ 例えば性別で男/女をオプションボタンで選択させるような 画面を作るとした場合、データベースとの連携って 皆さんどう設計していますか? フォームに男/女とオプションボタンを配置すると、 データとプログラムがくっ付いているので気持ち悪く、 いつも良い方法が無いかなと思っています。 マスタテーブルを用意して リストボックスと連動させてるよ > フォームに男/女とオプションボタンを配置すると、 > データとプログラムがくっ付いているので気持ち悪く 「オプションボタン」「データとプログラムがくっ付いている」「気持ち悪く」 と、どれも他人には何の事やら分からないことばっかりじゃないか。 具体的に言ってくれ。 >>192 社会保険庁のようにデータベースの性別の誤りを 訂正させたい場合以外は、男女のオプションボタンと データベースの連携なんて存在しないと思うのだが。 分かりづらくて申し訳ないです。 オプションボタンは、ラジオコントロールの事です。 ―――――――― | ○男 ●女 | ← グループの中から一つだけ選ぶ事が出来る ―――――――― 通常ラジオコントロールで、得られる値は数値になります。 上記例の場合、0=男、1=女 とかになります。 ただ、このままでは 0=男 はデータベース側ではなくて、 フォーム側の設定になり、それに合わせてDBも0、1 or 男、女 と 保存する事になります。 これでは、フォームとDBが密接に関係していると思い、どうなのかな? っと悩んでいます。 フォーム表示時に、ラジオコントロールを作成/追加させたりする方が 一般的なんでしょうか。 コンボボックス等であれば、データは切り離されていますので、 殆どの場合、考慮しなくて良いんですが…。 >>196 話のポイントはわかりました。私が疎いのかどうも環境がわからない。 Formの値が直接質問や挿入に使われるようですが、 データベース「プログラミング」はどこに居場所があるのですか? >>196 データベース内のデータと、人が見るGUI上の表示を変えることはよくあると思うが。 具体的に何のアプリ使ってるの? MS Access とか? データベース本体と、それを操作するGUIプログラムは別になってる方が一般的な気がする。 >>197 プログラミングの居場所? すみません。ちょっと分かりません。 例えば、ラジオコントロール と 登録ボタンだけの簡単なアプリがあったとして、 登録ボタンを選択時に、DBへ登録するなどです。 ラジオコントロールで 1=女 が選択されていれば、1がDBへ入ります。 ただ、この1は、フォームとDBで決まりごととして、対応する事になります。 例えば、女のIDを1→501 へ 値を変えた場合、フォームも変更しなければいけません。 通常、このような作りは良くないと思います。 >>198 環境は、SQL Server と VB.NET(2005) になります。 >>199 フォームが"1"の時はフィールド 性別 の値は"女"と変換するのが プログラムの役割だと思うのですが。 これだとフォームが変更されるとプログラムを変更しなくては ならなくなりますが、それがいけませんか? >>201 うーん。 「データとプログラムは分けるべき」って言うのが根底にあるんですが、 どうなんでしょうか。 この場合、DB側でもフォーム側でも、0=男、1=女 という情報を持っているわけですよね? どちらか片方(フォーム/DB)を修正したら、もう一方も修正が必要というのは、 設計がおかしいような気がしてならないのです。 それともそういうものなんでしょうか。 プログラムには、 if(seibetsu=="0") then function_otoko(); else if (seibetsu=="1") then function_onna(); のようなことがどこかに書かれているのでしょう? フォームとDBの修正どころか、プログラムも変更が必要に なると思います。 どうしても「データとプログラムはそれぞれ独立」にするべきだとすると 1 フォームのボタンの名, 2 そこで返される値, 3 データベースに格納されるときの値 の少なくともこの3項目をフィールドとして持つテープルを作っておいて、 まずこのテーブルを読み込み、変換してデータベースを処理するように プログラミングする。あるいはプログラムは何もせずJOINで処理する。 が、考えられるのではないか。 >>193 がこれに当たるのかどうか、よくわからない。 入力で返される値をそのままDBに保存するのはセキュリティホールの元 こんにちは、ど素人プログラマです。 SQLサーバー2000について教えて欲しいのですが、 あるテーブルに項目1、項目2、項目3が定義されているとして、 項目1の値が「1」のときは、項目2は必須項目 項目2の値が「1」以外のときは、項目3は必須項目 というような事を外部キー制約のように実現するにはどうすればいいのでしょうか? 制約? トリガ? DFD図を清書して資料として残そうと思っているのですが、 これを書く何か良いソフトは無いでしょうか? それともボールペン最強でしょうか? XEAD ってソフトがよさげなので、試してみることにしました。有難う御座いました。 昨日からDBMSの勉強始めた者です。すみません。 DBが複数の表を入れる器だというところまで理解しました。 素朴な疑問ですが、同じWebサービスを提供するアプリなどで、 ユーザ数ぶん器を用意するのが普通なのでしょうか? それとも、表を重複しない名前にして一つの器にブッこんでいけばよいのでしょうか? どこまでわかっているかしらんけど とりあえずいえるのはユーザー数に比例して増えるのはテーブルの行数 負荷が大きいと複数の物理的なデータベースサーバーを増やすがそれはまた別の話 >>212 なるほどありがとうございます。 1ユーザが、それぞれ顧客情報のテーブルや商品情報テーブルなどを持って ショップシステムを運営するような場面です。 1DB内に、顧客情報テーブルA、顧客情報テーブルB、商品情報テーブルA・・・と入れていき、 ABで区別して使おうかと考えました。 >>213 それならユーザーごとに別DBにするのが一般的だな。 >>213 レン鯖とかでcreatedb無理なら1個で、できるならユーザ別に、でいいんじゃね? 自分だけのデータベースならともかく、顧客情報とかも扱うデータベースつくろうって人が そういう知識じゃ危なすぎだろう。 テーブルは単なる例です。 説明しやすいかと思いまして。 ユーザーテーブルに ・ユーザー情報全般を更新 ・電話番号のみ更新 の2つの更新がある場合に、 @ 2種類のUPDATEを発行する処理を別々に作る A UPDATEを発行する処理は1箇所で、 1回SELECTしてとってきたデータに、更新したい情報のみセットして同じUPDATE処理を実行する (更新しないデータもSQL上だと set xxx = val, みたいになります) 1と2どちらがいいのでしょうか。 >>220 ありがとうございます。そうなった場合に同一テーブルに対するUPDATEが複数できてしまうのですが、こういうものなのでしょうか。 「UPDATEが複数できてしまう」とは、どこに出来ると考えてるの? >>222 Daoに2種類のメソッドができてしまうといったほうがいいでしょうか。。。 >>223 電話番号のみ更新用メソッドと、ユーザー情報全部更新用メソッドが出来るって事でしょ? ユーザー情報の更新に時間掛かるんだったら分けた方が良いし、 そうでなければ全部更新だけで良いような気がする。 どちらも主キーを条件に更新をするので更新件数は1件です。 1. updateAllで発行されるSQLは update userTbl set name = * , addr = * , tel = *, kubun = * where... 2. updateOnlyTelで発行されるSQLは update userTbl set tel = * where ... 全部更新だけを採用した場合、画面から受け取るのは主キーと電話番号だけなので、1は実行できないじゃないですか。 なので、1の全部更新を実行するために、主キーでデータを取得したDTOに画面からきた電話番号だけをセットして1を実行する、という流れになるのかなぁと。 さらに、kubunだけを更新するような機能が追加された場合に、 update userTbl set kubun = * where ... を作るのか、これだとupdate文ばかり種類が増えるのが気持ち悪いような気がして・・・ 画面表示や、画面からデータベースへ情報を受け渡すプログラムはどうしてるんだ? ユーザー情報が全て画面に表示してあるなら、そこから全情報を渡すこともできるんじゃないの? 画面上で変更された項目だけについてSQLを動的に作成することもできるだろ。 全情報更新は、ほとんどの入力項目がテキストボックスで編集画面にくると現在値がセットされいて、hiddenに主キーがあります。 電話番号のみ更新は、電話番号のみテキストボックスがあり編集画面にくると現在地がセットされていて、hiddenに主キーがあります。 動的にSQLを作るとは、例えばStringBufferとかでがんばるということですか? update userTbl set ************* where id = .. ***の部分を値があったら StringBuffer#append("name = " + name) という感じで。 本当に頭悪くてごめんなさい。 visual basic上で、SELECT文に変数を使用することは可能ですか? Ruby on railsなんて見ていると、DBプログラミングなんて必要なのかどうのなのか と思うのだが。 ああいうのが今後有望な方向の一つだとDB関係の御大が ACM Queueのインタビューで言ってたな。 MS-DOS時代の、CUIデータベースソフト(マイクロソフトアクセスの前身?)の名前がどうしても思い出せないんですが、おわかりになるかた、おしえてください。 よろしくお願いします。 >>231 通称マルチファイル マイクロソフトマルチツール - ファイル だったかな? - プラン 通称マルチプランが 表計算 他にマルチチャートってのがあった。 dBASEII の事じゃないよね? トリガーアクションとして、「プログラムの起動」ができるDBシステムは ありますか? Microsoft SQL Serverって商品名ですか? 分からないことがあってぐぐってるんですが、各々の単語って 一般名詞だと思いません? どうしてマイクロソフトアアアアアアアアアアア!!! >>236 Microsoftは一般名詞じゃないよ >>242 *nixの連中は再発名ばっかやってるよなw 再発名はあるいみ至言かもしれん。 同じ概念なのに名前だけが違うって意味だろ? マイクロソフトがお得意の。 かといって最近の*nixにオリジナルな新概念があれば 知りたいもんだが… パクリ元が尽きたせいでMicrosoft Researchがあの 規模になってんだyo! >>247 過去の蓄積をパクり終えた後はそりゃ当然だろ。 ある時代に研究開発しているものはどれも同じような問題意識が背景となるわけで。 パックってもいいが、意味無く文法かえたり名前変えたりして欲しくない ディレクトリのデリミタも素直にスラッシュにしておくべきだった マイクロソフトは自社のパクリ製品をスタンダードにしたがるからなあ。互換性で問題でまくり。 マカ方面も一般名詞のプロダクト多いし、頭にi付けたのばっか。 ワードじゃなくてページとか、パワーポイントじゃなくてキーノートとか。 またDARRPAがお金出して、戦争用のネットワーク構築に伴うOS開発ってやらないのか? OSの進化が止まってる。ネット機能以上の盛り上がりがないよな。仮想化もいまいちだし。 WEBデータベースプログラミングの卒論書くにもあまりサイトしらないので、書くのにオススメのWEBサイト教えてください GetMoney!では、名前に恥じないよう、皆様にキャッシュバックしやすい仕組みを 提供しております。 ぜひ、この機会に、GetMoney!に無料会員登録してみてください! http://dietnavi.com/?id=676366 MySQLにExcel (Office XP)からODBC接続すると、データが文字化けしてしまう。 DBにはUTF8で登録していて、クライアントはWinXP環境。 Connector/NET 接続だと問題無いんだけどね。 character-set系(skip-character-set-client-handshakeも)やら MyODBCで、set names utf8 などの設定をしてみたんだが駄目。 どうしても(日本語に)化けてしまう。 ちなみに、登録してあるのは日本語では無い(ISO-8859の11辺りだったかな?) なんだろ。。 補足。 データは、元がISO-8859-11?をUTF-8に変換してDBに登録していて。 それをExcel(MSAccessでも同じ)に読み込んでみると、 ISO-8859-11?の0x80以上にあたる文字が日本語に化けて表示されてしまいます。 ちなみに、そのデータを直接MSAccessに登録して、ODBCでExcelから読んでみると 正しく表示されたんで。少なくとも、MyODBCかMySQLの設定の問題だと思うんだけど。 MySQLのODBCコネクタには問題が多い バージョンによってもかなり挙動が違う ありがとう。そうなんだ。 しょうがない、Accessでやっとくか。 ======== my.ini [client] default-character-set=sjis skip-character-set-client-handshake [mysql] default-character-set=sjis [mysqld] default-character-set=sjis skip-character-set-client-handshake これをサーバー側かクライアント側のどっちかに置くと 正しく認識/余計な変換されなくなるとか何とか書いてあるサイトをみたことがある (サイトは忘れたしどのディレクトリに置くのかも忘れたので調べてくれ) >>259 なるほど。 mysqldの方には、skip-character-set-client-handshake を入れていたけど。 clientにも入れるのね。 試してみる、ありがとう。 うーん。駄目でした。 扱う文字が非sjis系でPCが日本語OSというところで、ドライバが上手く 動かないんだろうね。あきらめ。 とりあえず何かデータベース的なものを作ろうかと企んでるんですが 何かお勧めのものや準備しておくべきものとかってありますか? >>262 Accessを買う Accessの本を買う データベース的なもの データベース的なもの データベース的なもの データベース的なもの ISAMの勉強でもしやがれ マイクロソフトのSQL Server2005の評価版をダウンロードしたんですが インストーラのexeファイル(約955MB)にデジタル署名がされていないんです。 これってインストールしてもOK? マイクロソフトがデジタル署名なしにリリースするってありえる?? 基礎薬学医学のデータを蓄積して、ノートみたいに編集したり、必要時に検索できるようにするために、ちょうどいいデータベースソフトウェアなどありませんか? 化学構造式や写真、グラフ、文書をうまく管理して、学習に役立てられたらとおもってます。 また、論文や日記など、文書も管理・編集できるとよいです。 どなたか教えてもらえませんか? >>269 データベースっていうより資料を管理する手法を知りたいんだね。 資料を管理する手法をアプリケーションという形で提供されていればベストだよね。 それはソフトウエア板の「こんなソフト知りませんか?」スレで聞いたほうが良いね。 自分はエクセルを使っている。 ドキュメントは自分でテキストエディタで書く。そしてそこに引用されている図のための画像やらその他ファイルを一緒のフォルダに入れる。 このフォルダをエクセルにハイパーリンクで挿入して見出しの一覧としている。 この見出しをクリックすればそのフォルダが開き、そこには必要なもの一式が入っているというわけ。 で、検索はWindowsの検索を使用している。テキストファイルならこれで引っ掛けることができるからね。 これらをもっと統合的にやるアプリは俺もほしいと思う今日この頃。 データベース自作するののアルゴリズムとか載ってる本やHPない? Oracleを超えてやる。 ACCESSの具体的などんなことをしたいのか書かないとわからん。 基本的にデータベースソフトとWebサーバーソフトでは機能も違うから 似たようなことができるとはおもえんけど。。そのAccessみたいなことって 具体的になに? できんことはないよ。>>276 やってみやあ。データベースの定義はどんな定義したいのかしらないけど 普通にテーブル作成とかAccessでいうビューの作成とかデータインポート・表示とか できるよ。レポートも作成できるよ。HTML表示になるけど。がんばりゃあ。 PostgreSQLでC言語の埋め込みSQLってのがありますけど, "text"(不定長の文字列)として宣言されたフィールドを取り出す時って どのように宣言すればいいんでしょうか? EXEC SQL BEGIN DECLARE SECTION; text hoge; EXEC SQL END DECLARE SECTION; とかやってみたけど怒られました. サンプルに書いてあったように VARCHAR hoge; でも怒られるし. そもそも'text'は標準外だからサイズは固定するしかない? >>272 ありがとうございます。そのとおりです。windows office one note2007を使用することに決めました。ありがとうございます。 >>274-275 CGI+ExtJSでなんとかなる DB超初心者からの質問です。 employeeテーブルがあるとします。 列はid(PK)とnameからなるとします。 社員を追加削除を繰り返しているとidも欠番が出たりすると思います。 欠番は別に良いのですが、社員を追加するときにidに、現在テーブルにないidを探してinsertしないとダメですよね? このidをどうやって作るのですか? IDENTITYプロパティーをつければシステムによっては自動インクリメント値ということを本で読みました。 でもシステムによっては・・じゃ、だめっすよね。 あとシステムが自動でつけたidを得る必要がある場合、どうするんでしょう。 結局自分でユニークな値を作るの? >>282 > このidをどうやって作るのですか? 方法はいろいろとあると思います。 例)INSERT時の時刻、レコード件数、最大値 過去の最新のIDを格納するテーブルを作って、それを+1したものを新規ID とするということを過去にやったことがあります。 この場合、同じ時刻の登録操作によってIDが重複する可能性があります。 当然INSERTは蹴られるわけですが、そのときはリトライすればよい。また 適正なロックをかけることにより、このINSERTの失敗をを避けることができます。 こういう面倒なことをしなくてもよいために、DBによってはユニークIDを生成する機能 を持っています。(現在のほとんどのDBは持っていると思います) > あとシステムが自動でつけたidを得る必要がある場合、どうするんでしょう。 SELECTして見る。 >>283 ご回答ありがとうございます。 DBが用意してくれているユニークなIDを使うのがよさ気ですね。 もしemployeeのidが他のテーブルから外部キーに指定されている場合、 employeeに挿入したときにDBがつけてくれるidを使って他のテーブルにも挿入とかしたい場合もあると思いますが、 このときはselectでなんとか、その挿入したレコードを引っ張ってくるんですね。 その場合、テーブルをロックしてダーティーリードを防ぐ必要があるということかなぁ。 初心者なのでアホな事を言っているかもしれませんが。 >>284 INSERT INTOとSELECTサブクエリを使えばひとつのSQLステートメントで idに値が入った行を作成することができます。 DBのユニークID生成機能にも欠点がありまして、データのExport/Importをするとき 少々厄介です。 >>285 なるほど。。ちょっと感動してしまいました。 サブクエリか。 経験者のお言葉はありがたい。本当にありがとうございました。 >>282-285 そういうのはふつうsequenceを使う >>288 DBによって実装方法は異なる Oracle.PostgreSQL sequence MS-SQLServer IDENTIFYプロパティ DB2 DENTIFYプロパティ+sequence SQL:2003では2つが規格化されたね Sequence Generators Identity Columns 質問なんですが次のテーブルがあるとします。 ●社員名簿(emp_tbl) INT emp_id VCAHR() emp_name ●プロジェクトテーブル(proj_tbl) INT proj_id VCAHR() proj_name ※各プロジェクトは一人以上の社員が属します。また一人が複数のプロジェクトに属すこともあります。 ●質問 社員がプロジェクトに属していることをどう表現するの? 案1:proj_tblに配列(?)カラムmemberを追加し、ここにint型の社員番号(emp_id)を格納していく。 案2:新しくproj_member_tblというテーブルをつくり、このテーブルにproj_id emp_idというカラムを用意して proj_id │emp_id ───┼─── 1 .│1 1 .│2 2 .│1 2 .│3 のように表現する。 教えてDBの偉い人 >>191 ●プロジェクト配員テーブル INT emp_id INT proj_id 名称はプロジェクトメンバーテーブルでもプロジェクトアサインテーブルでもいいです。 >>291 とほとんど同じ状況なんだけど、加えて以下のような条件が加わる場合 どう設計すべき? ・社員はプロジェクト内での順序付けがある ・順序は恣意的に変更され得る ・プロジェクトPのN番目の社員といった読み取りが非常に多い ・プロジェクトに所属する社員の数に制限は無い(恐らく1000は超えない) スタンドアロンDBシステムでお勧めなのはAccessでしょうか? 調べたらMSDEってのを見つけたんですけどクライアントサーバ型に適するって書いてあったので。 Oracleも多分クライアントサーバ型でしょうし。 スタンドアロンDBってあまりないんですかね? Haskell用ドライバとかあって吹いた>SQLite 楽しそう 301 みんなSQLのことなんて読む? エスキューエル シークェル シーケル いまどきシーくぇるなんて呼んでいる奴はキチガイか変態 いまどきキューリーなんて呼んでいる奴も基地外か変態だ。 <img src="./img/****"> のファイル名の部分に、MySQLの値 $row["@@@@"]をいれたいんだが 上手く表示できない・・・誰か助けてください>< はじめまして。皆さんの知恵を貸してください! SQL Server 2005を使って以下のようなアプリを組んでいます。 SQL Server内にDBを2つ作成し、ひとつを格納DB、もうひとつを展開DBと呼びます。 格納DB内にはデータを格納するためのテーブルがひとつあり(格納テーブルと呼びます)、 格納テーブルにデータがInsertされるとトリガーによりストアドプロシージャ(Transact-SQL)が実行されます。 このストアドプロシージャは、格納テーブルのデータをインプットとし展開DBに反映します。 尚、格納テーブルにはプライマリーキー(IDENTITYにより自動裁番)を設定しています。 上記アプリを組んでいるのですが、以下のような問題が発生しています。 1.複数端末から格納テーブルにほぼ同時にレコードを追加した際、後発のトリガーがタイムアウトになってしまい、エラーとなる 2.トリガーがエラーとなった場合、格納テーブルへのレコード追加が無効になってしまう 上記問題を解決するための知恵をお貸しください! 理想は、格納テーブルにデータを格納した場合でもタイムアウトが発生しないようにしたいです。 展開DBへの反映遅れは数分であれば問題ありません。 ちなみにストアドプロシージャの平均実行時間は10秒程度です。 >>309 処理するタイミングを分ける。 ・端末からの通信で開始 → 格納テーブルへの追加 → 終了 ・ジョブなどを使って一定時間毎に開始 → 格納テーブルから反映されていないデータを読み取り → 展開DBへの反映 → 終了 展開DBに反映済みかどうかの判定には格納テーブルに反映済みフラグ列でも作って管理する。 あとは、ストアドを早くする、タイムアウトの時間を延ばす。 フィールドって言うんですか、「項目」。 既存のフォームに追加したいんですけど、さっぱりわかりません。 sunの無料のbaseです。 >フォームに追加したい >sunの無料のbaseです。 …はあ。 >さっぱりわかりません。 ホントにね。 仮想テーブルって実データをコピーして持っているのか 参照を持っているのかどちらでしょう? .NET 4.0 から System.Data.OracleClient は推奨しないよ ttp://blogs.msdn.com/adonet/archive/2009/06/15/system-data-oracleclient-update.aspx という話は知ってたが、まさか自分がその「修正するつもりのないバグ」に遭遇するとは思わなんだ。 ttp://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=411873 まじすか…orz .netからpro cでも呼ぶか、.net捨ててpro cで全部組めば。 全部phpでもいいけど。 >>318 できるかンなこと!w MS 推奨の ODP.NET 使うよりエラいことになるの必至だろ! つーことで、とりあえず小手先 (クエリちょっと修正) で押さえ込んだ。 今のMysql5.1ってdoubleとか文字列に変換しないでそのまま格納できるみたいだが、 C++で格納したり取り出したりできるの? atofとかじゃ誤差で使い物にならん。 初めて触ったのはinformixだった。 その会社があるとき忽然と消えたので 仕方がないのでMSのにしたが使い勝手が悪かった。 仕方がなく自作していたらすごいものになってしまった。 これをベクトル型データベースと名づけたい。 無料で公開してくれ。パクって販売して大もうけするから。 http://pc11.2ch.net/test/read.cgi/db/1057152569/ [終了]今は亡きInformixに文句を言うスレ[おつかれ] 無料で公開されるものを金出して買う人間がいればいいが そこは多少手を加えて、サポートで毎月金取るから。 レドハトの毎月保守版と思えばおk。 データベースをいじるのにVBかC#どっちがお勧めか教えて どっちも微妙。 データベース自体は何? SQL Server? Microsoft Accessは、サブクエリーがろくに使えないな。 実行速度が極端に遅くなったりとか、構文エラー扱いになったり。 Microsoft SQL-ServerとかOracleとかの普通のDBMSなら、特に遅く なったり、構文エラーになったりしないはずだ。 >>331 インデックスが効くサブクエリなら CPUスペック相応の速度で返ってくるけどな 設計がおかしいかスワップしてるんじゃないの そもそもmdbでがんばってもな。 メモリガッツリ確保してるsqlserverには勝てないでしょ。 sql server compactのフロントエンドになんないかな RDB初心者なのですが、疑問があるので詳しい方教えていただけないでしょうか? テーブルのサイズが大きくなると重くなるので、キーのハッシュ値などで、 複数のテーブルにレコードを分散させておき高速化する、パーティショニングなる 技術があるらしいと聞きました。 データベースエンジンは高速に検索するための良いアルゴリズムを 持っているものと想像していたのですが、 この程度の最適化すらされていないということなのでしょうか? それとも、物理的に別のストレージに割り当てることによって、ストレージのアク セスを並列に行うことによる高速化を狙っているのでしょうか? 長ったらしい質問で申し訳ありません。一般的なデータベースのボトルネック がどこにあるかなどの感覚がよくわかっていないもので。 >>335 データーに対してユーザーがどういう検索をするかなんてのは データーベース側にはわからない。 最適化ってのはある特定の条件に対し最高のパフォーマンス出すように チューニングすることだからな。 インデックスの種類についても知っておくと良いよ ウマく最適化する設計をしないと駄目なんじゃない。 自家用車が高速走れても、f1の様な競技に出たり、災害復興の燃料運ぶのには最適化されてないだろ。 ちゃんとf1や災害復興を想定して自家用車の設計しないと。 高級言語で記述すると実行が遅く成ったりするから、アセンブラで記述すると言う技術が有るのに、プログラマなら高速に実行する為の言語を習得していると想像しているのに、 実際はみんなアセンブラ程度すら組めずに計算機に最適化すらされてない低スペックだったりするのと同じ。 プログラマの生産性のボトルネックってどこに有るのだろうねw みなさん親切なお返事ありがとうございます。 確かに検索する条件、頻度、キーの分布など考えて最適化する必要は 大いにあると思います。 私の経験の範囲では、ほとんどのクエリが連番IDのみをキーに検索する ようにテーブルを用意できることが多く、そのイメージで考えたときに 疑問が起こりました。 現在抱えている要件では、ユニークな連番IDを持つテーブルを、 そのIDのみで検索するが、それが非常に多くの端末から頻繁に発行される。 というものです。しかも単独のテーブルに対してです。 当然連番IDにプライマリキーを設定しているのですが、 このくらいシンプルな条件の場合でパーティショニングに効果はあるのでしょうか? >>339 連番IDがある範囲で分けられるなら意味はあるかもしれない。 年度の範囲でパーティション化して検索自体が当年分が多いとか。 ただその案件だとレプリカ作ってアクセス分散したほうがいいかもね >>340 なるほど、連番ID以外のカラムで、検索の偏りがある分類ができるのなら、 その分類でパーティション化する意味が出てくるということですね。 今すごくイメージが湧きました。 レプリカつくってアクセス分散というのは、当初>335で私が書いたように、 ストレージのアクセス時間を分散して並列化させるという意味合いで あっていますか? レコード内容は、比較的頻繁に書き換えが起こるのですが、このテーブルに レプリカを作った場合、同期処理によって負荷が逆に高くなる心配などは あまりしなくてよいものでしょうか? 質問ばかりで申し訳ありません。 >>341 参照系かと思ってレプリカと書いたけど DBMS何つかってるかわからないが 更新があるならなるべくメモリにのるようにパラメータ調整したほうがいいかも 結局負荷を気にしたら、オンメモリデータベースに行き着くのかもねえ。 Oracle TimesTen In-Memory DatabaseやOh-Pa 1/3とか。 ググッタ感じだと小田急とかケンタとかサンクスとかOh-Pa 1/3使ってたりするのねえ。 >>342 MySQLを使用しております。 メモリ上にキャッシュを置くことが効果的だろうことは理解できるのですが、 一般的なDBMSは特に設定を行わない場合にメモリキャッシュを勝手に 使ったりはしないものなのでしょうか? 使用する側で多くの手間をかけて検索の最適化をするくらいなら、 最初から自分でデータ管理処理を書いたほうが融通が効いて楽な気さえ してしまいます。 これもDBMS初心者の無知ゆえかもしれませんが。 >>344 MySQLは使った事がないので知らんが、通常「限られたメモリを配分する のに何を重視するか」の設定をする場合が多い。DBMSはデータ以外にも いろんなものをメモリ上に置いている。バランスの問題。 ちなみにパーティショニングの検討が必要なのは、テーブルのサイズが 2GBを超えるようなでかいテーブルだ。at Oracle そもそも無料のmysqlで困らない程度じゃなあ。 ttp://dev.mysql.com/doc/refman/5.1/ja/memory-storage-engine.html 13.7. MEMORY (HEAP) ストレージエンジン >>346 MEMORYストレージなんてものがあるんですね。勉強になります。 クラッシュ時に消えてしまっては困るので、通常のテーブルと 同じ構成で2重化しておき、書き換えを伴わない場合はこちらを 使うなどすれば、キャッシュとして使えそうですね。 ところで、有料のデータベースエンジンであればMySQLに比べて 困らないことが多いのでしょうか? 調べてみても機能・性能面での違いがよくわからないのです。 まあ実際困った事が無ければ、ググって探し切れても実感はしないかもね。 オンメモリじゃないと捌ききれないって状況は結構有ったりする。 その辺は商用というか開発費にもろに関係してるだろうな。 買うのにも年間保守料にも高額のコストが必要なほうがやっぱりきっちり作り込みされてる。 そこまで要らないよって場面も多いので使い分けというか選択肢がたくさんあってもいいとは思うけど。 データベースをプログラミングするスレじゃなくて データベースを使ったプログラミングをするスレか DB板ってなんで隔離されてんの? ミドルウェアだからとか言う理由なら、 ミドルウェア板作って統合すりゃ多少は賑わうんじゃね。 特殊だからだろ、ハゲっが。 SQL文っは、プログラムでもない、 だが、DBっは、奥が深いだろ、ハゲっが。 ∧_∧ ( ´・ω・`) ∧_∧ / \ ( )何言ってんだこいつ .__| | .| |_ / ヽ ||\  ̄ ̄ ̄ ̄ / .| | | ||\..∧_∧ (⌒\|__./ ./ ||. ( ) ~\_____ノ| ∧_∧ / ヽ 空気読めよ \| ( ) | ヽ \/ ヽ. オマエ馬鹿だろ | |ヽ、二⌒) / .| | | .| ヽ \∧_∧ (⌒\|__./ / >>357 てめぇのせいでスレが止まったじゃねぇかどうしてくれる 「SQL」が略称か否かで揉める奴が必ず居るけどあれって何なの? wikiの説明文みたいに Visual Basic 2010 で、データベース入出力のバッチ処理を行うためのプログラムを書きましたが、非常に時間がかかります。 ・ 具体的には、3列の表に10個のデータを格納するだけで11秒などという時間がかかっています。 以下に述べる構成のうち、設計として悪い部分は複数あるだろうと思いますが、パフォーマンスに影響する問題点を指摘してください。 ・ Database.sdf のテーブルを DataSet.xsd の編集画面へドラッグ&ドロップすると、DataTable, TableAdapter の派生クラス MyTable, MyTableAdapterが生成されました。 ・ MyTable という Public Class を作り、MyTableAdapter のインスタンス adapter を Private Shared 変数に格納しています。 ・ MyTable には、上記 adapter を (入出力を加工しながら) 操作する Public Shared メソッド/プロパティを実装してあります。 >>360 自己解決。超バカだった。これから具体的に書きます。 ・ TableAdapter は実際のデータと DataTable との間をつなぐもの。 ・ これを、DataTable と外部コードとの間をつなぐクエリを集めたものと誤解。 ・ シコシコと書いたクエリを直接たたいて TableAdapter を操作していたため、毎回 SQL が発行されていた。 orz 単純にDBいじくるだけならADO.NETのデータセットを作る必要すらなくて、DBへの ラッパークラスを作ってSQLベタ打ちが一番楽で早いという現実 どんなに複雑な抽出分もSQLのみで作成する事が可能なんでしょうか。 特別な関数が必要なものとか、条件判断のための正確なアルゴリズムが見つかってないものとか、無限大・無限小の計算が必要なものとかは無理だろ。 >>1-1000 おまえら一盛り10円 http://www.kh.rim.or.jp/ ~nagamura/misc/stroustrup-interview.html 今androidでコミックビューワ作ってるんだけどページを100枚くらい使うともう重くて無理なんでネットからだんだん落としていって100ページ読み込ませようかと。で、ここで使うのがデータベースなのかなあーと思ったんだけど合ってる? データベースプログラミングではないのですが、 B木についての課題で困っています。 こちらで質問してもよろしいでしょうか? ム板にアルゴリズム系のスレが無くなってるんだよな 誰の仕業かなー もうデータベース板自体が息してないからなあ。 景気悪くなるとデータベースって一気に話題消えるんだなw _ |O\ | \ キリキリ ∧|∧ \ キリキリ ググゥ>(;⌒ヽ \ ∪ | (~) ∪∪ γ´⌒`ヽ ) ) {i:i:i:i:i:i:i:i:} ( ( ( ´・ω・)、 (O ⌒ )O ⊂_)∪ MySQLでシフトJIS使ってたら何かまずい事がある? webアプリを作る際にdbを使おうとしています. javaからいじるときの書き方なんですが 例えばデータを読み取るsql文を発行する関数を作ったときには, その関数内でStatementとかResultSetとかを閉じるものなのですか? あと,データベースとの接続を閉じるのはいつにすればいいのでしょうか? >>383 変更時のタイムスタンプと変更内容を正規的に記述する Entity Frameworkで DbContext を使って開いたデータベースの テーブルの個数が知りたいのですがどうやったら取得可能でしょうか Magic quotesはオフにしよう http://codezine.jp/article/detail/2480?p=2 本題からは外れますが、特別な理由がない限り、SQL文はプリペアードステートメントを使って実行するようにしてください。 これはSQLインジェクション攻撃に対する最も基本的な対策です。基本的なことにも関わらず、プリペアードステートメントが あまり使われていないのには以下のような理由があるのではないかと、筆者は推測しています。 SQLを文字列で作って実行するという直観的にわかりやすい方法が入門書等で紹介される。 初心者がそれをそのまま真似る。 SQLインジェクション攻撃に対して脆弱なウェブアプリが量産される。 PHPの開発者が「Magic quotes」というマジックを導入する。Magic quotesによって、ブラウザから送られた「O'Reilly」という文字列は、自動的に「O\'Reilly」に変換されようになる(脆弱性回避)。 この「O\'Reilly」という文字列は、プリペアードステートメントでは使えない(余計なバックスラッシュが入ってしまう)。 プリペアードステートメントは使われなくなる。 データを勝手に書き換えてしまうMagic quotesがデフォルトで有効になっているのは困ったことです。 PHPをインストールしたら、設定ファイル(php.ini)を探して、「magic_quotes_gpc = Off」としておきましょう。 >>387 5.3 2009-06-30 <- magic_quotes_gpcがobsoleteになる 5.4 2012-03-01 <- magic_quotes_gpcが削除される 5.5 2013-07-20 <- いまここ NetWareサーバでbtrieve使ってたころは インジェクションとかなんとか悩む必要なかったんだよな 自分で競馬データベースや競馬新聞を作りたいんだが どんなプログラミング言語を学習すればいいですか? 競馬を通してプログラミングを勉強すれば楽しいと思うし、 仕事にも役立つとなれば一石二鳥。 データーソースは外部の物を利用。 >>392 c++、Haskell、Ocaml、Scala c++ならc++cmsを使ってCMSサイトを作れる HaskellならYesod、ScalaならLift 速度重視ならc++、バグを含まないように作りたいならHaskell 性能と実績ならJVM上にあるScalaがベターだよ 想定顧客数すら見えないんだからPHPかRuby/Railsじゃね たとえば、1つの製品を作成するのに掛る部品リストのテーブルが以下だった場合。 ID,製品,部品名称,部品個数 グリッドに表示させる時や出力させる時は横に並んでほしい場合は結構あるかと思います。 製品,部品1名称,部品1個数,部品2名称,部品2個数,部品3名称,部品3個数〜〜 こういう時は一般的どうするのがスマートなんでしょうか? たとえばAccessでグリッドに表示させたい場合、もしくはcsv、Excelで出力したい場合など。 行列変換・クロス表については、ミックの本にも書いてある 達人に学ぶ SQL徹底指南書、2012、ミック セルコ信者の著者が、より簡単にパズルチックに解説する 内容は集合論、3値論理など Webにも解説あるよ ttp://codezine.jp/article/detail/751 C# + Connector/Net + MySQL でデータベースの勉強し始めたんですが、Connector/Netのライブラリを把握しきれないうえに、データベースプログラミングで確実に身に付けるべき作法みたいなものがよく分かりません。 オススメの入門書を教えていただけないでしょうか? みんなの意見を聞かせてください データベースを設計しているんだけど、 例えば、定食マスタがあるとしてそれの内容を持ってるテーブルが別にあるとする A定食に対して、おひたし・ごはん・味噌汁・豚肉炒め・サラダ等 んで、あるとき豚インフルで豚肉が提供できなくなったとして、豚肉炒めから牛肉炒めに変更しA+定食にしたとする(値段等そのたの問題は抜きとする) その場合、定食の構成としては1品しか変わらないわけだけど、それぞれに同じ構成を持つとデータだけ増えていくよね 例だと品数は少ないけど、定食の数も数百種類、それぞれの構成も何十種類となった場合、 基本はAの構成だけど、バージョンが上がって一部構成が変更になった場合、 どういう風にデータベースを設計したらいいと思いますか? やはり別のものとして丸々構成を持った方が良いのでしょうか? 説明が下手ですみません。どうかよろしくお願いします。 >>403 数百や数千なら個別に作るけどな 定食なら日本全国のを集めても数千も無いだろうしwww >>403 BOMとか部品表とかで色々調べるとよいかも。 テーブルの使い方次第だけど、定食が1日に100百食作る予定だから、 あらかじめ材料を何キロ買っておく、みたいな使い方をするなら、 12月1日からのA定食の構成要素をはこれとこれを含むという 適用範囲を持ったテーブルになると思う。 まぁ、テーブルの使い方によって設計が変わるはず C# で、System.Data.SQLite を利用しているのですが、 データベースファイル内のテーブルの数、ないしテーブル一覧を取得するにはどうすれば良いでしょうか? 長いことIT業界にいるが、 いまだに排他制御が完全なシステムを 作ってるのに出会ったことがない・・・ 俺自身、どのレベルで何をどうしたら 完璧になるのか良く分かってないしな。 DBアクセスのたびにDB全体を完全ロックすれば完璧だよ! DB用に専用線を引いて、通信を暗号化すれば完璧だよ >>408 汎用機のオンラインシステムは完璧な排他制御を求められたんだがな。 RDBなら本来、アプリケーション側で排他制御なんかしないよな。 DBにとって必要な整合性と、アプリにとって必要な整合性は違うのだよ >>413 データベースが勝手に排他制御をしてくれるとでも? 当たり前だろ。そうじゃなきゃDBMSの意味がない。 で、普通は明示的な排他制御などやらずに適切なトランザクション分離レベルを宣言するんだが、 わかってない奴が設計するとそこが適切じゃなくて、「この処理の前にこっちのテーブルをロックしなきゃ」 なんてことになる。 >>418 テーブルに最終更新時間とか持たせて、 表示させた後にDBに書き込むときに、 最終更新時間が取得したときと違ってたら エラーを表示するとかなんたらって、 ズラズラとコードを書いたりしないか? >>418 分離レベルだけで勝手にやってくれるとでも? >>420 ロングトランザクションのために仕方なく読み出しと書き込みを分けるなら、たしかにそういう、 いわゆる楽観的ロックを使う場面もあるね。 その場合は両者のトランザクションは独立したものとして、つまり読み出しがない書き込み トランザクションにも正しく対応できるよう設計すればいい。 もちろんこれも「排他」制御ではない。 >>422 そういう同時実行時の不整合を起こさない仕組みも含めたのを排他制御とは言わないのかい? >>419 >>414 が良い事言ってる。と思ったら414=419かよw すくなくとも「DBにとって必要な整合性」は保障されるだろ >>418 が「アプリにとって必要な整合性」をどう考えてるのかは知らんが >>422 あたりを見るに、それは>>418 にとっては排他処理ではないらしいから考慮外なんだろう 理想は分離レベルの指定だけですべて済ませればいいんだが なかなかそう言うわけにはいかないのが現実 VB ScriptのADOで Do Loop の中に rs.movenext書き忘れるとなにがおこるの? rs.delete してればそのうち終わるんじゃね? SQLServerで教えて下さい。 saユーザでログインし、管理者用のDB_Aと、 ユーザ用のDB_Bを作成し、 ユーザ用のユーザを作成しました。 DB_Aにselectするために権限を振りたいのですが、うまくいかないです。 どのようにすればいいですか? 検索の仕方が悪いのか、データベースのデータから特定のx行y列目の値を一つの変数へ格納する方法が見つからない… コマンドプロンプト上で検索するやり方は特定の行または列だけ。 excelなら行と列を指定すればそのセルの値を取得できるが、他の面で不便だ SQliteなんだが、特定のx行y列目の値を一つの変数へ格納する方法が知りたい >>435 はあ? RDBは行列の2次元の表が基本だぞ。 >>433 RDBには行の順番というものはないぞ。 SELECT 文に ORDER BY をつけてようやく順番が決まった表みたいなものになる 数十万、数百万件もあるかもしれないデータをいきなり何行目とか指定できない 順番にfetchするとかカーソル使うとか、、、特定の何番目かの行だけ取り出したければ LIMIT OFFSET使うとか >>434 >>437 行"数"は無いのか…。 多くのサイトの説明だと 「select カラム from テーブル where 条件」で抽出できる、みたいに書いてある。 けれど抽出したデータを任意に作った変数にどう取り込むのか、までは載ってないんだ… 変数っていうのは、ゲームの例で言えば、 特定のモンスターの能力値を読み込むときに、モンスターに振り分けたIDなりでデータベースを検索して、 攻撃力・守備力・魔法力の数値が全部載ってる行を見つける けれど、そのまとまった情報をゲーム上のステータスにどう反映すればいいのかがわからない。 攻撃力を表す変数Xに攻撃力の数値を入れたいんだよね。 レコードを特定して列指定で格納値を取得 さらに列の型に応じてゴニョゴニョする…とこの辺がわかってないのか C/C++ じゃなくて VBとかスクリプトだと余計なこと考えなくていいんだけど 多分ダメなんだろうな >>433 >「select カラム from テーブル where 条件」で抽出できる、みたいに書いてある。 >けれど抽出したデータを任意に作った変数にどう取り込むのか、までは載ってないんだ… change your mind わからなければORMでも使えばいい みんなのくれるヒントをもとに検索かけてるんだがやっぱりだめだ…… >>441 ORMというものの説明をさっくり見ても理解できなかった。すまん >>440 VB.netのほうが取っつきやすいから、そっちのほうで良い方法を載せてるサイトを知らないか? 日を跨いですまん >>443 これはわかりやすくて使いやすいな。 ただ最も知りたいのは、ここから自分の作った変数へ当て嵌める方法でな…。 たとえば ttp://www.dbonline.jp/mysql/select/index20.htmlの例を使うなら、 サブクエリを使って求めた行のうちのname"〜"の値を、適当な変数Xに入れて X = "〜" としたいんだ。 >>442 VB.NETつかうんならADO.NET使えば? 変数ってホストの話か?お前らよく付き合うな。言語も環境もなんも書いてないのに。 住所氏名電話番号とかいろんなデータに、どんなデータ型が最適かまとめられたリストってありませんか? 質問なんですが、 accessはもちろんofficeすらインストールしていないpcで、 vs2015から、mdbファイルを利用できます またaccessをデータセットとして利用できます これ何ででしょうか? もしかしてvs2015には、もれなくaccessもついてくるのかな? 当方、日曜プログラマです 上記は、JRAVAN,datalab競馬ソフト開発体験教室レッスン7を実行した結果です http://jra-van.jp/dlb/sdv/trial.html いや、日曜プログラマだと語弊があるかもしれない 日曜日に趣味で勉強しているおっさんです プログラマではないです accessという製品はタダでは付いてきません mdbにアクセスするためのプロバイダはoffice無しでも利用できます >>456 レスども やっぱりaccessはないわけですか あれ有料ですもんね ありがとうございました >>458 accessとbaseの互換性がいまいちわからないんですよね mdbファイルは開けるけど 現状dbはほぼ未経験、accessもbaseも未経験 adoの勉強始めたとこですね 選択肢の1つとして考えときます ありがとうございます libreOfficeっていけてるデータプロバイダあんの? >>454 テーブルで RDB したいだけだったら Access は不要 >>460 libreOffice から mdb にリンクするのが吉 >>461 そうみたいですね Accessは入ってるけど、機能制限がかかってる感じなのかな Access2016のダウンロード版のダウンロードサイズが1kbということは、 機能はwindowsに入ってんのかね?1kbはライセンスだけだよな 質問失礼します。 以下の順番でレコードの重複回避処理を行っています。 @ A.php で Z テーブルの X カラムの値が 49 のレコードを select してレコードの存在チェックを行う。 A @で存在しなければ、A.php で Z テーブルの X カラムの値が 49 のレコードを insert する。 今日、上司からAで insert している最中に他の A.php が走り、 2回レコードが insert されてしまう(つまりレコードが重複してしまう)可能性があるんじゃないの?って聞かれました。 そういう事は考えられるのでしょうか? またそれを回避するにはどういう SQL 文(トランザクションでしょうか?)を書いたら良いのでしょうか? 分かる方、よろしくお願いします。 すいません。 開発環境を忘れてました。 php7.0.6 MySQL5.6 よろしくお願いします。 すいません。また補足です。 Z テーブルの X カラムにユニーク属性は付けていません。 他にもカラムがあって設計上付けないことになっています。 >>469 > そういう事は考えられるのでしょうか? 考えられる。 > またそれを回避するにはどういう SQL 文(トランザクションでしょうか?)を書いたら良いのでしょうか? Z.Xにユニーク制約をつけるのが一番簡単。 >>471 > Z テーブルの X カラムにユニーク属性は付けていません。 そうなんだ。 じゃ最適解はわからない。テーブルロックか? @とAをSerializableなトランザクションでやればいい。 できるだろ。 SERIALIZABLEの意味わかってるか? >>476 こういうケースで問題がある。 table t: (a integer, b integer) user1がa=3のレコードを、user2がa=4のレコードを同時に作成しようとする。 本来なら、別のデータを登録する処理なので、両立すべき。 user1: set tx_isolation = serializable; user1: begin; user1: select count(*) from t where a=3; -> データがないことを確認できる user2: set tx_isolation = serializable; user2: begin; user2: select count(*) from t where a=4; -> データがないことを確認できる user1: insert into t values(3, 300); -> 処理がブロックする user2: insert into t values(4, 400); -> エラー発生(Deadlock found)、user1のブロック解除 user2: rollback; user1: commit; 結果として、user2はデータを登録できない。 >>469 の要件は満たしてるのに、 >本来なら、別のデータを登録する処理なので、両立すべき。 なんでこういう条件を勝手に追加するんだか。 しかも、それぞれのトランザクション分離レベルで守らなければならないことと 実装に任されていることとの区別もついていないようだ。 >user2: select count(*) from t where a=4; -> データがないことを確認できる ここでuser2をブロックあるいは失敗させてuser1を成功させてもSERIALIZABLEの 要件は満たすし、仮にここでブロックする実装なら >user2: insert into t values(4, 400); -> エラー発生(Deadlock found)、user1のブロック解除 これをエラーにする必要もないんだが。 >>478 > なんでこういう条件を勝手に追加するんだか。 別に勝手に追加したわけじゃなくて、>>477 は普通の正常系の話。 複数人が別々のデータを同時に登録するなら、それは成功してしかるべき。 > これをエラーにする必要もないんだが。 なにか勘違いしてるようだけど、>>478 は、 ・お互い分離レベルがserializableなtransactionにする ・処理は、「存在確認」→「なければinsert」という処理 を普通に行う実装で、「->」以降はそれを実行した結果。 > >user2: select count(*) from t where a=4; -> データがないことを確認できる > ここでuser2をブロックあるいは失敗させてuser1を成功させてもSERIALIZABLEの > 要件は満たすし serializableの要件を満たすことが目的ではないし、普通に実装すればuser2はブロックしないし 失敗もしない。 > >user2: insert into t values(4, 400); -> エラー発生(Deadlock found)、user1のブロック解除 > これをエラーにする必要もないんだが。 どういう意味? エラーにするんじゃなくて、エラーが発生するんだけど。 というか、クライアントを二つ立ち上げて、>>477 を実査にやってみれば、俺が言ってることを納得できると思う。 >別に勝手に追加したわけじゃなくて、>>477 は普通の正常系の話。 >複数人が別々のデータを同時に登録するなら、それは成功してしかるべき。 そもそもトランザクションは常に失敗の可能性があるってことすら理解してないのか。 >>469 はそんなもの問題として挙げてないし、これが実際に問題となるかどうかはもう少し 具体的にアクセス規模や性能要件なんかを出して議論するものだ。 >serializableの要件を満たすことが目的ではないし、普通に実装すればuser2はブロックしないし >失敗もしない。 >エラーにするんじゃなくて、エラーが発生するんだけど。 >>478 に書いた「実装」ってのはDBMSの実装のことな。 SERIALIZABLEの要件を満たすのもエラーを出すのもDBMS側の仕事。 極端な話、 >user1: select count(*) from t where a=3; -> データがないことを確認できる 安直なDBMならここでtにテーブル排他ロックをかけるかもしれない。それでも規格準拠だ。 それを踏まえてもういちど>>478 を読み返してみな。 >というか、クライアントを二つ立ち上げて、>>477 を実査にやってみれば、俺が言ってることを納得できると思う。 >>478 と同じことを書くけど、おまえさんはSQL標準で規定されたトランザクションの仕様と 個々のDBMSの実装の区別がついていない。 >>481 あ、MySQL前提じゃなかったんだね。 じゃ話があわない。 標準規格のserializableの話だとして>>478 を読み直すと、結論としては>>481 はMySQLの分離レベルの 実装はなってないということか? 返答ありがとうございました。 前提条件が不明確でいらぬトラブルを生んでしまったかもしれません。 すいませんでした。 やりたい事をまとめますと「複数同時に実行される A.php で、明確に1レコードだけが挿入されるようにしたい」です。 結局処理は、シリアライズな?トランザクションの使い方も良く分かっていないので以下のように設計しました。 @ Z テーブルの X カラムの値が 49 のレコードが存在するかチェックする(ほとんどの場合はココではじかれる) A Q テーブルに T レコードが存在していなければ、ユニークなユーザーIDの入った T レコードを挿入する INSERT INTO SELECT ? Bその直後、その T レコードの id (オートインクリメント)の値が一番大きい T レコードを取得する C T レコードを挿入したのが自分(ユーザーIDでチェックする)ならば、Z テーブルの X カラムの値が 49 のレコードを insert する。 これで A.php が複数同時に走ったとしても一回しか通らないはずです。 大丈夫ですよね? PDOを利用しています。 要は他スレッド?の A.php による挿入をブロックしなければならないのですが、オーソドックスなやり方を知りたいです。。。 コードが正しいのか、タイミングをほぼ同時にできるかつ自動で微妙に時間をでずらすソフトを作成して、百本ノックならぬ100億本ノックで安全を担保しようとしています。 凄くタコなやり方ですが、これ以外に安全を担保するやり方を知らないので。。。 Qテーブルに1レコードしか存在し得ないよう制約がかけられているのならOK。複数挿入できるならNG。 そもそもそんなQテーブルが作れるのなら素直にZにユニーク制約をかけることを検討した方が いいんじゃないかとは思うが。 あと、ロングトランザクションなら楽観的ロックも仕方ないが、ちゃんとトランザクションの使い方を 学んだ方が後々苦労せずに済むと思うがねぇ。 そもそもMySQLって、エンジンによってはトランザクションそのものをサポートしてなかった気がするけど MySQLの排他制御がどうなってるか知らんが、普通に考えれば テーブル全体に排他ロック獲得 チェック インサート テーブルロック解除 でできるんじゃね 同時実効性とかロック待ちで性能低下とか知った事じゃないけどな >>469 1で存在チェックしてから、2で挿入するって、 1と2の間に、他のプロセスが割り込めるから、典型的なダメパターン。 教科書に書いてある、やっちゃいけない事前問い合わせ 一々、2回もSQL実行するのは無駄。 いきなり、挿入すればいい。 挿入できなければエラーになるだけ @のような丸囲み文字は、Windowsの環境依存文字だから、使わないように カタカナは日本でしか通じないから Englishで書いてください >>485 おい、いつのまにか対象とするテーブルが一つから二つに増えてるぞ。 あと、値が49ってなんだよ・・・。 > 大丈夫ですよね? 全然駄目。 すなおにテーブルロックすべし。 返答ありがとうございます。 一つ間違っていました。 丸3 の「一番大きい T レコードを〜」は「一番小さい T レコードを〜」でした。 >>486 >Qテーブルに1レコードしか存在し得ないよう制約がかけられているのならOK。複数挿入できるならNG。 複数挿入できないように制約をかけます。 良く分かってないので怖いですが、INSERT INTO SELECT(行が無ければ挿入?)で実現しようとしています。 >>487 テーブルロックは使わない方法でご教授いただければと思います。 >>488 丸2 で「存在していなければ挿入」とするので、丸1 は必要ないのですが、念のために入れてるだけです。 >>490 テーブルロックは使わない方法でご教授いただければと思います。 >2回もSQL実行するのは無駄 指摘を受けてハッとしました。 やりたい事を伝え忘れていました。 「Z テーブルの X カラムの値が 49 のレコード」は結果テーブル1行だけというのは変わらないのですが、 その直前にわりと大きめのトランザクションが走ります。 そのトランザクションが複数走るのではと心配になっていました。 トランザクションはまとめて一気に走らせて「何かに失敗したら全部ロールバックできる便利な機能」位しか理解できていません。 仕組みが良く分かっていないので今勉強中です。 2人から同じご指摘いただいているので、普通はテーブルロックで行うって事ですよね。。。 ちょっとそちらも勉強して理解を深めようと思います。 進捗があったらまた書き込ませていただきます。 >>492 なんか話が変わってきているが、>>469 に沿って言えば、Z.Xにユニーク制約を付けるのが「普通」。 あと、トランザクションの大小は関係ない。 3msで終了する「存在チェック→insert」というトランザクションでも、複数人が実行するのなら競合する可能性はある。 >>492 トランザクションを勉強するのはいいが、ロックのことは一旦忘れた方がいい。理解の妨げになる。 明示的にロックを「使う」なんて言うのはトランザクション分離レベルを理解できなかったジジイのやること。 トランザクション分離レベルのことがわかっていると、今回のケースでテーブルロックを使わなくてもいいってことか? 今回のケースに限らず、基本的にロックなんて使う必要ない。そもそも標準SQLにロックなんてないしな。 必要があるとすれば、SQL92のトランザクション対応してない古いシステムでどうしてもやらないと ならない場合とか、全部わかってる人があえて標準じゃできない使い方をする場合くらい。 >>494-495 ロックってのは基本的には分離レベルに応じてDBMSが勝手にやってくれる 今回の例ならSERIALIZABLEでトランザクション流せば良いだけ 理想は分離レベルの指定だけで済ますことなんだが 現実的には、どの分離レベルでどういうSQL流したらどういうロックが獲得されるかはちゃんと理解しとかないと パフォーマンス的な問題がでるかもしれんがな >理想は分離レベルの指定だけで済ますことなんだが >現実的には、どの分離レベルでどういうSQL流したらどういうロックが獲得されるかはちゃんと理解しとかないと それは別に相反する話じゃないが。 >>497 > 今回の例ならSERIALIZABLEでトランザクション流せば良いだけ 同じテーブルに同時に別のデータをINSERTすることがないという限定条件付きだけどな。 普通は、同じテーブルに同時に別のデータをINSERTすることもあるし、同時に同じデータをINSERTすることもある。 で、同時に同じデータをINSERTされないようにするには、普通はunique制限を付ける。 なんらかの理由でunique制限を付けられない場合は、論理的にはテーブルをロックするしかない。 その「テーブルをロックする」というのが、MySQLで上の限定条件に限り、目的と合致するというだけの話。 >>499 お前の言う限定条件ってのは理解できない だれかに言われてたけど、トランザクションは常に失敗の可能性があるってことすら理解してないのか? あるいは同時実行されるトランザクションが複数あれば、ロック待ちが発生する可能性があるって事が理解できない? >>論理的にはテーブルをロックするしかない だから、SERIALIZABLEなトランザクションってのは必要ならそう言う動作するわけだが MySQLどうこうじゃなくて、SERIALIZABLEを正しく実装してる全てのDBMSで正しく動作するけど? MySQLがトランザクションとSERIALIZABLE分離レベルを正しく実装してるかどうかはしらん ロックロック言う奴はやっぱりトランザクション分離レベルが理解できてないという好例>>499 >>477 がちょっと気になったんだが 本当に先行トランザクションのuser1のinsertがブロックされたり user2が(ロックタイムアウトじゃなくて)デッドロックで落ちたりするのか? それがホントなら誰かMySqlのャ鴻bク周りにつb「て詳しい解説ャTイト教えてくb うは、なんか文字化けしとる MySqlのロック周りについて詳しい解説サイト教えてくれ と書いたんだが、さて >>500 まず、俺がトランザクションについて理解していないとか、分離レベルについて理解していないとか、 そういう思い込みを捨てろ。俺に言わせれば、お前の方が理解していないように見えるんだが。 > MySQLどうこうじゃなくて、SERIALIZABLEを正しく実装してる全てのDBMSで正しく動作するけど? いや、serializableなトランザクションに関する各RDBMSの実装が異なっているというのが前提で、 だからこそ「serializableなトランザクションを使えばうまくいく」という一般論にはならない。 なので、「MySQLならこういう限定条件であればserializableなトランザクションを使えば良い」という ようにしか言えない。 > >>477 がちょっと気になったんだが > 本当に先行トランザクションのuser1のinsertがブロックされたり > user2が(ロックタイムアウトじゃなくて)デッドロックで落ちたりするのか? いやいや、実行結果って書いたじゃん。実際に自分でもやってみたら? > それがホントなら誰かMySqlのロック周りについて詳しい解説サイト教えてくれ 「mysql serializable」でググった1ページ目には、その「詳しい解説」は見つからなかったのか? PostgreSQLでもやってみた。 user1: begin transaction isolation level serializable; user1: select count(*) from t where a=3; -> データがないことを確認できる user2: set tx_isolation = serializable; user2: begin transaction isolation level serializable; user2: select count(*) from t where a=4; -> データがないことを確認できる user1: insert into t values(3, 300); -> insertは完了する user2: insert into t values(4, 400); -> insertは完了する user1: select count(*) from t; -> 1 user2: select count(*) from t; -> 1 user1: commit; -> 成功する user2: commit; -> エラー発生 > ERROR: トランザクション間で read/write の依存性があったため、アクセスの直列化ができませんでした > DETAIL: Reason code: Canceled on identification as a pivot, during commit attempt. > HINT: リトライが行われた場合、このトランザクションは成功するかもしれません 各RDBMSがserializableなトランザクションの実装で保証するのは「ファントムリードがないこと」であって、 それを実現する方法は各RDBMSの実装にまかされている。 訂正: >>505 の > user2: set tx_isolation = serializable; は削除し忘れ。 少し解説を加えると、RDBMSはserializableなトランザクション内の文脈を見て成功・失敗を決めているわけではなく、 ただ単にファントムリードが発生しないような実装にしているだけ。 あと、ロックと処理がブロックするというのは別の話。 ファントムリードを防ぐという目的の場合に、read lock対read lockなら処理はブロックしないという実装もありだし、 read lock対read lockでも処理をブロックするという実装もありえる。 またserializableなトランザクションの場合、リトライすればOKな場合がある。 そもそも、トランザクションが重ならなければお互いOKになる場合ね。 そういうケースでは、SQL CODEの内容からリトライ可能かどうかを判定してリトライするという実装が必要。 もちろん1回だけのリトライではまた他のトランザクションと重なる場合があるので、MAX回数を決めてリトライを 続ける必要がある。 そういう面倒くさいことをしてまでも、ファントムリードを防がなければならないケースに限って、トランザクションを serializableにするというのが正しい使いだと思う。 ユニーク性を担保したいだけだったら、テーブルロックで十分。 テーブルロックは常に成功するとでも思ってるんだろうか >>509 デッドロックになるようなロックのかけ方すればエラーになるだろうけど、それと今回の話とは関係ないよね。 デッドロックとロックタイムアウトの区別もつかない人か まあserializableで単独テーブルに対するアクセスでデッドロックするのもどうなんだという感じがしないでもないが それでも少なくとも2重登録の防止って要件はserializableで満たしてるわけだが 同時実行する他のトランザクションがエラーになるのはダメとか、それは分離レベルが保証することではないし リトライすればOKな事もあるとか、もはや分離レベル関係ないし >いや、serializableなトランザクションに関する各RDBMSの実装が異なっているというのが前提で、 >だからこそ「serializableなトランザクションを使えばうまくいく」という一般論にはならない。 この時点で理解してないのは明らか。そもそもSERIALIZABLEは無条件に直列化可能で あることを保証するものだし。 >各RDBMSがserializableなトランザクションの実装で保証するのは「ファントムリードがないこと」であって、 >それを実現する方法は各RDBMSの実装にまかされている。 ファントムリードが起きない「だけ」なんだが、直列化可能性を保証するにはそれで十分なわけ。 まさか「ファントムリードがない」ってのを、単に他トランザクションで挿入したレコードを 見せないだけとでも思ってるんだろうか。 >>511 もうお前の主張にはなにも興味はないが、mysqlとpostgresqlの実装にたいする感想くらいくれよ。 >>511 > まあserializableで単独テーブルに対するアクセスでデッドロックするのもどうなんだという感じがしないでもないが あ、これがmysqlの実装に対する感想なのか? じゃ、もういいや。 最後に一つだけ。 「SERIALIZABLEは無条件に直列化可能であることを保証するもの」の意味が全然わからんが、 ユニーク性を担保するためには、同時に実行される可能性があるトランザクションを「直列化」する 必要があり、それにはテーブルロックを使うのが最も簡単。 これに反論がある場合に限ってレスしてくれ。 >>515 への直接のレスがなければ、これでserializable話は終了します。 いい加減うざいだろうし。 「serializableなトランザクションとは何か」は、以下のスライドが俺が見つけた範囲だと一番わかりやすいと思う(それでもわかりづらいんだが)。 『トランザクションをSerializableにする4つの方法』 http://www.slideshare.net/kumagi/serializable4-56309007 「SERIALIZABLEじゃ無理」→「問題がある」→「ロックの方が簡単」 なんだかなぁw 普通はトランザクション開始時に隔離レベルを1行指定する方がいちいちテーブルを指定して ロックをかけるより簡単だと思うんだが。 「(今からトランザクションを理解するより)ロックの方が簡単」という個人的事情なのかね? >>517 ロックの詳細や問題点を正確に把握できてないんじゃないの >serializableなトランザクションの場合、リトライすればOKな場合がある >そういう面倒くさいことをしてまでも、ファントムリードを防がなければならないケースに限って、トランザクションを > serializableにするというのが正しい使いだと思う。 と、あたかも自分でテーブルロックすれば他のトランザクションやリトライ系については考慮いらないかのようなこと言ってるし >テーブルロックは常に成功するとでも思ってるんだろうか っていう突っ込みに対して >デッドロックになるようなロックのかけ方すればエラーになるだろうけど って回答してるし >デッドロックとロックタイムアウトの区別もつかない人か についてはまともな反論してないからな デッドロック以外にロックでエラーは出ないと思ってるんだろ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる