パスワードを忘れた? アカウント作成
9459474 story
データベース

/.Jに聞け:SQL/DBの正しい学び方は? 54

ストーリー by hylom
Wikipediaで調べる(真顔) 部門より
あるAnonymous Coward 曰く、

本家/.「Ask Slashdot: Learning DB the Right Way; Books, Tutorials, or What?」より。

技術畑の人間が新たにPostgreSQLでSQL/DBを学ぶのに最良の方法は本だろうか、それともチュートリアルだろうか?もしくはそれよりも良い策が他にあるだろうか。

今までは他の人の書いたコードを読んだり、実際にいろいろ試したり、PostgreSQLドキュメントに目を通したりして学んできた。その甲斐もあってかDBを理解してきたが、まだ多くのことを知らないし間違って身に付いていることもあるだろう。その証拠にスラドでDBのストーリーを読むと初めて目にする用語が結構ある。

なお、自分はプログラミングに関しては複数言語で長年の経験があるが、SQLに関してはPostgreSQLを通じて多少いじった程度である。数学は三角法、代数、少々の統計をかじったバックグラウンドがある。

また、近くに通える大学はなく、DBに詳しい人も周りにいないため独学せざるを得なく、インターネットと本が頼りなのが実情であることを付け加えておきたい。

本家/.ではクリス・デイトが著した「データベースシステム概論」を推す声が多いようだ。/.J諸兄方はどのようにして学んできただろうか?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 書籍あれこれ (スコア:5, 参考になる)

    by Anonymous Coward on 2013年07月17日 10時49分 (#2422729)

    入門はこれがいいんじゃないかな
    「SQL-ゼロからはじめるデータベース操作」 [amazon.co.jp] ミック

    データベース設計の入門はこの辺
    「達人に学ぶDB設計 徹底指南書」 [amazon.co.jp] ミック
    「楽々ERDレッスン」 [amazon.co.jp] 羽生章洋

    他のコメントでも挙がってるけど、以下の本は持ってるべき。でも入門書じゃないね。
    「プログラマのためのSQL 第4版」 [amazon.co.jp] Joe Celko

    タイトルに反して理想論的な本だけど、以下の本も読んでおくといいと思う。これ絶版なのかあ。
    「データベース実践講義 ―エンジニアのためのリレーショナル理論 」 [amazon.co.jp] C.J.Date

    •  この親コメント、誰かプラスモデレートしてくれるとうれしいなあ。

       RDBは集合論と関係モデルをベースにしているので、そこを理解するだけでおおちがい。実践優先だとそこまでたどりつくのはたいへん……

       でも単なるストレージ代わりにRDBを使うケースもあって、そういうのにはもうちょっと適切な選択肢があるといいのだけど。

      # NoSQLの登場はそういう意味でも朗報。

      親コメント
      • by TarZ (28055) on 2013年07月17日 13時38分 (#2422842) 日記

        でも単なるストレージ代わりにRDBを使うケースもあって、そういうのにはもうちょっと適切な選択肢があるといいのだけど。

        これは本当にそう思いますね。

        実際、私の知っている開発の範囲で、わざわざ関係データベース使わなくてもいいんじゃないか、と思えるケースは多いのですが、やはり揃っている機能や実績、ノウハウの豊富さで RDBMS を選択することがほとんどです。

        近年はようやく状況が変わりつつあるようですが。

        親コメント
      • by Anonymous Coward

        ODBは駄目ですかそうですか

    • by Anonymous Coward

      タイトルに反して理想論的な本だけど、以下の本も読んでおくといいと思う。これ絶版なのかあ。
      「データベース実践講義 ―エンジニアのためのリレーショナル理論 」 [amazon.co.jp] C.J.Date

      O'Reilly Ebook Storeで買えるようです
      http://www.oreilly.co.jp/books/4873112753/ [oreilly.co.jp]

  • 基礎を勉強するならデータベーススペシャリスト試験の参考書がよくまとまっていて良い。
    分厚くて高価な本は枕にしかならない。

    # 全て実証済み。

    --
    -------- tear straight across --------
    • by BIWYFI (11941) on 2013年07月17日 9時25分 (#2422678) 日記

      ああ、参考書は使えそうだね。

      でも、その前に、過去問なり、予想問題集なりの「問題文『だけ』」を入手して解くのが先かな?
      こっちなら、小一時間で済む。

      で、回答出来なかった問題を参考書を見ながら解いて、知識を補充。
      そして、「謎の用語」に出会った所で、その用語を詳しく説明する専門書の順序なら、積まれ難い。

      でも、ぶっちゃけ、「DB設計に正解は無い」んだよね。
      一番重要なのは「何処で折り合いを付けるか」で、これは数こなす以外に身に付かない。

      更に、DB設計だと、対象の業務知識と、下位のプログラム設計レベルでの知識の両方を持って無いと適切な設計が出来ない。出来れば運用レベルの知識も欲しい。

      更に更に、必要なデータや処理するAPIなんかがコロコロ変わるから、常に最新情報を追いかけないと、ポンコツ人間しか残らない。

      こんなのを網羅する「教科書なんて実在しない」が真の答えじゃないかな?

      --
      -- Buy It When You Found It --
      親コメント
    • まずはSQLから離れてデータベースの(データ構造)を勉強するべき。

      きちんと設計されたDBならSQLなんてどうにでもなる。
      というかクエリーがうまく書けるように設計されてる。

      まず、RDBを勉強、設計するツールとしてER図

      親コメント
      • by Anonymous Coward

        まさにこれ
        人に教わろうとする前にまず手と頭を動かせと言いたいね。DBに限った話じゃないが

    • by Anonymous Coward

      そう言われると確かに、独学ではこれがお勧めできると思えた。
      もちろん、デキる師匠がいてくれたら良いんだけど。

      DB個別のチューンに関してはそれぞれの専門書を当たらなければならないけれど、
      DBについての基礎力自体はこの方法が良さそう。
      午前の範囲に関しては問題が解けるようになる必要はないと思うけれど、
      午後問題はちゃんと頭を悩ませてみた方が良い。むしろ午後問題が肝。

      DBって、特に勉強なしに使ってみても使えるけど、
      「独学でとりあえず使ってみる」では、気付けない部分が出てくるんだよね。
      ちょっとしたWebアプリなどはそれでも問題なかったりするから、歪な知識になりがち。
      DBを学びたい、という目的ではちょっとお勧めできない。

    • by Anonymous Coward

      え〜、データベーススペシャリスト試験の参考書って枕にちょうどいいのに。

  • by Anonymous Coward on 2013年07月17日 6時40分 (#2422621)

    Web App を作ってみるのを勧めます。
    友人たちにつかってもらいながら、少しずつ機能を追加したり、不具合を直していくと実践的な勉強にもになるしね。
    使ってもらいやすいように、みんなの自己紹介を掲載して、友人同士で紹介しあうサービスなんかいいんじゃないかな?

    • by Anonymous Coward

      Web Appだと単なる Data Storeにしか使わない例も多いからRDBを深く学びたい人には役に立たないだろ。

      そもそも、アプリを作ってみて壁に当たった人にアプリを作ってみろって助言になってないよ。

  • SQL for Smarties (スコア:2, 参考になる)

    by Anonymous Coward on 2013年07月17日 6時51分 (#2422625)

    プログラマのためのSQL [amazon.co.jp]は持っておくべき。

    ただし入門書ではないので、これ一つだけでものにするのは難しい。

  • 自分がDBをを理解したのは「ねえ○○、明日の朝までにこの設計書(という名の要件定義書)通りにDAO作っといてもらえる?」の一言がきっかけでした。
    あとはまあ、実践を通して徐々に。

    • データベースの難しいところは、
      「要件定義を満たすDB設計・問い合わせSQL」であっても、
      ちょっとした違いでパフォーマンスが大きく違うってところにあると思う。

      DB設計で言うと、正規化されてなかったり横展開されてたりとかですね。
      こっちはまあ、教科書的に学習するのは難しくないですが、
      最初の設計が腐ってたら後から修正するのは困難なので「実践を通して徐々に」なてやってほしくない。

      一方SQLの方は、まあ後から修正するが容易なのでまだマシですが…

      普通のプログラミング言語を使っていて、線形探索だのバブルソートだのを使ってたら、見る者が見ればすぐに気づくけど、
      SQLの場合、同じSQL文でもDB定義(インデックス)次第で線形探索になったりn分探索になったりする。
      動作としては問題ないから「実践を通して」なんてやってたりすると、いつまで経っても問題に気づけないでしょう。

      SQL文を組み立てたときは、とりあえずEXPLAINで確認かな。

      親コメント
      • >データベースの難しいところは、
        >「要件定義を満たすDB設計・問い合わせSQL」であっても、
        >ちょっとした違いでパフォーマンスが大きく違うってところにあると思う。
        むしろそれはDBの「簡単な所」だと思う。
        パフォーマンスが悪くても、そこの部分だけをちょっと修正すれば直せるんだから。

        プログラムでパフォーマンス問題が出た時は、んな簡単には直せない。
        データ構造とアルゴリズムを見直し、コード全部を書き直す必要に迫られることもしばしば。
        だからプログラムではパフォーマンス問題が出る前に、コードを書く前に事前に問題を
        潰しておく必要がある。

        >普通のプログラミング言語を使っていて、線形探索だのバブルソートだのを使ってたら、見る者が見ればすぐに気づくけど、

        んなのはパフォーマンス以前の問題だと思うなあ。
        DBでいうならインデックスを「全く」張ってなかったレベル。

        そしてソートだけならソートアルゴリズムを入れ替えれば早くなる。
        大した問題じゃない。

        親コメント
        • 一応まあわかりやすく説明するために、設計の善し悪しの指標としてパフォーマンスを挙げましたけど、それだけの問題じゃないです。

          > パフォーマンスが悪くても、そこの部分だけをちょっと修正すれば直せる

          元コメで挙げた「正規化されてなかったり横展開されてたり」なんてレベルだと、「ちょっと修正」なんてむりでしょう。
          参照だけならビューを作って誤魔化せるけど、更新が絡むと絶対無理が出る。

          > ソートだけならソートアルゴリズムを入れ替えれば早くなる。

          ソートを挙げたのは、アルゴリズムの善し悪しの例。SQL文の善し悪しの例のつもりではありませんでした。
          SQLでいうなら、結合で簡単に処理できるのにサブクエリを使ってるとか、無駄にUNIONを繰り返してるとか、
          そういう「結果は同じだけどパフォーマンスの悪いSQL文」というのはいくらでも存在します。

          で、一番の問題は、たとえ「ちょっと修正すれば直せる」ものだとしても、そもそも「実践を通して学習」しているような人は、「修正すべき」であることすら認識できない、ってことでしょう。

          #まあ、「実践を通して学習」することの問題は、DBに限った話ではないでしょう。
          #プログラミングを実践を通して学習したような人は「計算量」というものについて理解できていない場合が多いと思う。

          親コメント
          • >元コメで挙げた「正規化されてなかったり横展開されてたり」なんてレベルだと、「ちょっと修正」なんてむりでしょう。
            それ超初心者の話だし。

            逆にいうと、DBの世界では注意すべき点が「片手で数えられるくらい」でしかないってことでもある。
            そんなのは教えれば教えられる程度。
            プログラミングの場合は「数え切れないくらい」にある。

            >で、一番の問題は、たとえ「ちょっと修正すれば直せる」ものだとしても、そもそも「実践を通して学習」しているような人は、「修正すべき」であることすら認識できない、ってことでしょう。

            そこはプログラミングでも一緒。
            DBの方が難しいわけじゃない。

            むしろプログラミングの方が問題を認識するテクニックを習得するのが格段に難しい。

            親コメント
            • 逆にいうと、DBの世界では注意すべき点が「片手で数えられるくらい」でしかないってことでもある。
              そんなのは教えれば教えられる程度。

              おお、すごい。それはぜひここに書いてほしいですね。きっと参考になる人も多いでしょうし、日本のIT産業のレベルの底上げという意味でも大変有意義だと思います。

              私も知りたいです。ぜひぜひ。

              親コメント
      • あと、ちゃんとANALYZEして統計情報を作っておくってのも、当たり前だけど大事だよね。
        性能でないっていうので見に行くと、こういう基本的な(インデックス作るよりもさらに前の)とこで
        ミスってることがある。

        それから、1990年代に現役でその後知識更新してない、Rule-based Optimizer 派の言うことは
        聞いちゃダメ。あれこそバッドノウハウ。今は Cost-based Optimizer 使って、適宜インデックス
        張れば、よほどDB設計ミスってない限りは性能出せるはず。

        親コメント
    • by Anonymous Coward

      これに一票。
      ○○を学ぶには?ってスレがときどき立つけど、必要なら自然に覚えるし、そうでなきゃそんな奴はどうにでもなればいいと思う。

    • by Anonymous Coward

      同じく……会社入る前は絶対DBだけは携わりたくないと思ってたのに
      今はバリバリ使わされてる

      バッドノウハウなんじゃないかと思いながらも
      チューニングでいじる部分のうち半分位はDBアクセスに関する部分だから悲しい。

    • by Anonymous Coward

      逆にプログラムのプの字も知らないSIにSQLの重要さを理解させるのってかなり大変なんよね。

  • タレコミ内容無視するけど、独学はやっぱり限界がある。

  • by NaruTo (1519) on 2013年07月17日 10時15分 (#2422701) ホームページ 日記

    僕は MS Access から RDB に入ったのだが、
    MS Access の場合、GUI でクエリを作成するツールがあり、これが意外に「テーブル」や「JOIN」に対する直観を養うのに有効だった。
    ほかの DB でも GUIツールはあるのだが、Access みたいに GUIツールの方が前面には来ていないようだし。

    --
    マクロの基本は検索置換(by y.mikome)
  • by siva-jp (18925) on 2013年07月17日 15時40分 (#2422926)

    T/O
    #つーか、若い人はンなこと言われても知らないか…(^^;

  • まとまった知識が欲しいなら、「参考文献や講習の多いDBMSを学ぶ」のが良いです。目的のDBMSは、その次に。

    # 日本だとoracleが一番参考書多いのかしら?

    --
    notice : I ignore an anonymous contribution.
    • 会社から Oracle Bronze 資格取れと言われて参考書を勉強したら、
      基礎から実践までひと通り理解できました。SQLの解説書を参考にしながら
      プログラミングしていた頃に比べれば、だいぶ進歩。
      まあベンダ資格なので、SQLが標準と違うとか、多少の欠点はあります。

      親コメント
    • by Anonymous Coward on 2013年07月17日 18時36分 (#2423049)

      同じ会社が作ってるはずなのにOracleとMySQLになると最適化の方法が全然違うけどな。
      Ver 5.5で改善されたけどサブクエリーでインデックスが使えないとかな。サブクエリーからは数個に絞れるはずなのにインデックスが使えないからとんでもなく遅くなる。仕方ないんでクエリーを分けて実行とかしないといけないとかいうバッドノウハウはどう身に着けますか?

      親コメント
  • 文法的に正しければいいのであれば、オラクルの資格試験でもやればいいのかと

    #手っ取り早いのは実地だけど、運の要素が強すぎる
  • by Anonymous Coward on 2013年07月17日 6時29分 (#2422619)

    自分で作った。卒論で教官が無茶振りしてくれたおかげ。
    トランザクションも何も無しで、create table, insert, update, delete, selectだけだったかな。
    なぜかraw deviceを使っていたので、その辺りのいじり方を覚えたのが収穫だった。

  • by Anonymous Coward on 2013年07月17日 10時48分 (#2422728)

    もう十数年以上前になるが、丸山不二夫先生の「UNIX データベース入門 [wakhok.ac.jp]」で SQL の基本を学びながら PostgreSQL をいじりはじめた。
    コンパクトな内容だが、後半では「 データベースの論理設計」等にもきちんと触れられているのでオススメ。
    多分、大学に通っても授業レベルだとこれ以上の内容は望めないと思う。

    セキュリティ対策関連の内容には触れられてないため、IPA の「安全なウェブサイトの作り方 [ipa.go.jp]」の別冊である「安全なSQLの呼び出し方」 を併読すると良いと思う。

  • by Anonymous Coward on 2013年07月17日 12時45分 (#2422793)

    エンドユーザかプログラマーか設計者か管理者かで違うと思う。

    エンドユーザならSQLとDBの概念がわかってればいい。
    プログラマーならトランザクションの知識とDBで使われるアルゴリズムの知識。
    管理者は使用するDBMS毎の知識。
    設計者は正規化と上記全部を広く浅く。

typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...