皆さんはデータベースを触られることはありますか?
自分はRDBをよく使ってきたのですが、あまり意味をわかっていない状態で挙動だけなんとなくわかったようになっているものが多いので、今回単語帳を作っておこうと思い立ちました。
RDB
RDBはリレーショナルデータベースのことで、MySQLなどが有名ですね。
NoSQL
NoSQLはRDB以外のDBのことのようです。
MongoDBなどが有名どころのようですが、思ったより細分化されているようでした。
とはいえ、データ構造が自由であることが特徴というところだけ押さえておけば良いのかなと思っています。
スケーラビリティも高いようですが、検索の効率を上げるためのインデックスの貼り方はどのようになっているのかは気になるところです。
ストアドプロシージャ
RDBに対するSQLをまとめておいたり、あらかじめ命令を格納しておくことで高速化するもののようです。
そもそも、プロシージャとは何か?というと、戻り値のない関数のようなイメージとのことです。
参考)ストアドプロシージャとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
プリペアドステートメント
あらかじめSQL文の中に置き換え対象となる文字(プレースホルダ)を用意しておくことで、後から変数を代入することができるものです。
これによって型を間違えることがなくなったり、SQLインジェクションの対策になったりします。
この時、String型はどのように判断するんだろう?と思っていたのですが、プリペアドステートメントではプレースホルダに入力された値はSQLの構文としては解釈しないようになるので、攻撃文字列が入っていても無視されるようです。
例)
ユーザからの入力値をINPUT_VALUEとした時に、単にシングルクォートで囲っていると、以下のようになります。
select * from sample_table where id = 'INPUT_VALUE';
ここで、入力値が ' OR 1 = 1 のような文字列だった場合、DBの全情報が出てしまいます。
そもそも、*でデータを取得するのも良くないとは思いますが…
select * from sample_table where id = '' OR 1 = 1';
こんな時に、プリペアドステートメントを利用していれば、以下のようになります。
select * from sample_table where id = ?;
この時、?に対してユーザの入力値を入れるのですが、あくまで文字列として扱われるため、「' OR 1 = 1」というidが検索されるので安全ということのようでした。
これは便利ですね。
Joinのチートシート
Joinも何が何か忘れがちなので残しておきます。
SQL Joins CheatSheet - Active Webdezign
感想
こう考えると、NoSQLに関して全くわかっていなかったので、今度しっかりと調べてみようと考えています。