用語集

AUTO_INCREMENT

自動連番挿入。
値が存在しない場合、自動的に新しい値に割り当てるルール。
主キーに使うのが理想的。

Not Null

中身がない状態を許可しないルール。

ORM

「オブジェクト関係マッピング」の略。

オブジェクト指向のプログラミング言語で、SQLを扱えるようにするという技術
・・・と言うと、単純に普段使ってるじゃん! と思われるかもしれない。

この技術は、単純にオブジェクト指向言語でSQLを使えるようにするものではなく、
オブジェクト指向の書き方で、
メソッドにアクセスする事で、SQLを扱えるようにする事。

PHPの場合、Symphonyというライブラリに含まれている、
「Doctrine」がそれに該当する。
また、Laravelでは、「Eloquent」という名称で標準搭載されている。

逆にORMを使わない方法とは、SQL文を文字列で記述し、
SQLサーバーに投げるという方法である。

SQLインジェクション

フォームにSQLの部品として認識される値を入れ、誤認識させる攻撃方法。

フォームから受け取った値を、なんの加工もせずに、
そのままSQL文に入れて実行する事で、発生する。

Wikipediaで紹介している例の場合、

t' OR 't' = 't

という値を、フォームに入力して、以下のようなSQL文を完成させている。

SELECT * FROM users WHERE name = 't' OR 't' = 't';

これは何を意味するかと言えば、
WHERE句の条件の中に、「OR」という「または」の項目を作り、
「't' = 't'」で、常に真の値になるような構造にしている。

つまり、「name = 't'」の部分で照合に失敗しても、
「't' = 't'」の部分で、成功している事になる。

そして、ここから出力される結果は、テーブル内のすべてのレコードとなる。
つまりは、他の人の個人情報も一緒に出力されるという事態が発生する

これを防ぐには、SQL文に使われそうな、半角記号をエスケープしたり、
プリペアドステートメントを使うなどの処置を、施すとよい。

外部キー

他のテーブルと関連付けを行うための列。
対象のテーブルの主キーと、外部キーを照合する事で、
論理的な結合を可能とする。

「FOREIGN KEY」とも呼ばれ、読みは「フォーリンキー」でいいと思われる。

外部キー制約

他のテーブルの外部キー列と照合し、その列にない値を入力拒否できるルール。

この制約を課す事により、関連付け元のテーブルに、
親となるべきデータが存在しない状態、いわゆる迷子データをなくす事ができる。

つまりは、親に存在しないカテゴリーのデータは作成できないというルールを、
データベース側で作る事ができる。

しかし、あまり極端に外部キー制約をつけすぎると、
テストのデータが作成しづらくなったり、
データベースの引っ越し作業が困難になる事もある。

「レコード」とも呼ばれる。
GUIツールから見ると、横軸の要素。

データが入力されて出来たものが、行と考えるとよい。

サロゲートキー

行識別のために使われ、実際にシステムのステータスや、表示には使われない値の事。

システム内では使わない値のため、ムダだという声もあるが、
作っておけば、確実に利便性は向上する。

射影

「物の影を映す」という意味の単語だが、
データベース用語においては、
データベースから取得した値を出力する事に該当する。

データベースから値を取り出すとき、
中身は移動しないで内容を外に映し出す
と考えると、いいかもしれない。

主キー

「プライマリーキー」とも呼ぶ。
行ごとのID番号と言ってもいい。

例えば、社員を検索する際に、氏名で検索すると、
同姓同名の人がいた場合、正確な検索ができないため、
社員番号で検索すれば、確実である。
その社員番号を主キーに割り当てるのが理想的である。

また、主キーはユニークキーでもあり、Not Nullの要素でもある。

主キーのないテーブルを作る事も可能ではあるが、
作らなければ、他のテーブルとの関連付けに不利になるため、
やはり作っておいたほうがよい。

ストアドプロシージャ

要は、SQLサーバー上で動く、手続き型プログラムのようなもの。
複数のSQLを、まとめて発行できる利点もあり、
ネットワーク負荷を抑えられる要因にもなる。

逆に、データベースサーバーの負荷がかかるうえ、
仕様変更が伴うと、アプリだけでなく、
ストアドプロシージャのコードも見直す必要が出てくる。
また、もしSQLエンジンが変わってしまうと、
それもやはり、コードの見直しが発生してしまう要因となる。

個人的には時代遅れの遺物のようにしか思えない・・・

テーブル

いわゆる、親要素。
この中にデータが保存され、「列」という要素で区切られている。

トランザクション

すべての手続きが成功した場合にのみ、その結果を反映し、
もし1つでも失敗した場合、元に戻せる仕組み。

基本的には、トランザクションの開始・終了および元に戻す命令も、
コードに記述する必要がある。

Oracleにおいては、開始だけはSQLを発行した時点で、自動的に行われる。

フィールド

列と行で識別した、ひとつの要素。
Excelでいえば「セル」である。

複合主キー

ひとつのテーブルに、複数設定された主キー。

通常の主キーは、同じ値を持てないユニークな存在であるが、
複合主キーの場合、すべての主キーを組み合わせて、ようやくユニークな要素となる
つまり、結合などを行う際には、複合主キーの数だけ照合しなければならず
複雑化を懸念する声もある。

プリペアドステートメント

PHPのデータベース接続オブジェクト「PDO」に用意された機能。

SQL文を渡すには「prepare()」メソッドを使用。
SQL文には「?」を記載しておき、後で「bindValue()」メソッドで値を渡す事で、
SQL文内の「?」が、渡した値に置き換わるというもの。

最後には「execute()」メソッドで実行する。

「?」はプレースホルダーと呼び、値を置き換える際には、
データ照合などを行うため、SQLインジェクションの危機を回避できる。

「:name」のようにプレースホルダーを明示的にわかるようにし、
「execute()」メソッドに連装配列を渡す事で、
連装配列のキー名に一致したプレースホルダーに、配列内の値を渡すという事も可能。

文/句

SQL単一に対しては「文」と呼ばれる。

主に、SELECTで値を検索するSQL文を「SELECT文」と呼び、
INSERTで値を挿入するSQL文を「INSERT文」と呼ぶ。

SELECTやFROMなどのキーワードで区切られた部分を「句」と呼ぶ。

たまに「SELECT文」や「SELECT句」という言葉が、
同時に出てくる事もあるが、
要するに「SELECT文」は、SELECTを行うSQL文全体、
「SELECT句」は、SELECTのキーワードで指定する、
出力列などの範囲と考えるとよい。

この「文」と「句」の違いは、Oracle試験にもさりげなく出てくるため要注意。

マスタデータ

社員の名前や、ゲームのキャラクターの基本パラメータなど、
めったに変える事はないが、
コード上に書くよりも編集がしやすくするため、
データベース上に配置する場合がある。

一見、データベースへのアクセス数を増やし、負荷をかけそうな方法だが、
「memcached」によりキャッシュデータを作っておけば、
その問題は解決できるはずである。

ユニークキー

「ユニーク」とは、「一意の」という意味である。
同じテーブルの同じ列同士で、同じ値を持つことが出来ないルール。

「カラム」とも呼ばれる。
GUIで見れば縦軸の要素で、いちばん上にはカラム名が確認できる。
基本的には、このカラム名を指定し、
主キーで行を指定する事で、データを参照する事になる。