データベースって、エクセルの表とは何が違うんですか?
見た目はよく似た表なんだけど、大量のデータを、たくさんの人が、矛盾なく使えるようにルールで守られているのがデータベースなんだ。学校の名簿で考えてみよう。
データベースとDBMS
データベース は、たくさんのデータを決まった形で整理し、検索や更新をしやすくしたデータの集まりです。ネットショップの会員情報、銀行の口座残高、図書館の蔵書目録などがデータベースで管理されています。
データベースを管理するソフトウェアを DBMS(データベース管理システム)といいます。DBMSは次のような仕事をします。
- データの 登録・検索・更新・削除 を受け付ける
- 複数の人が同時に更新しても矛盾しないように制御する(排他制御)
- 障害が起きたときに元の状態に戻す(障害回復)
- 利用者ごとに見られるデータを制限する(アクセス権の管理)
関係データベース:データを「表」で管理する
データを 行と列からなる表 で表すデータベースを 関係データベース(リレーショナルデータベース、RDB)といいます。現在もっとも広く使われている方式です。
| 呼び方 | 意味 | 別名 |
|---|---|---|
| 表 | データ全体の入れ物 | テーブル、関係(リレーション) |
| 行 | 1件分のデータ(生徒1人分) | レコード、タプル |
| 列 | データの項目(氏名、クラスなど) | フィールド、属性 |
主キー:行を1つに決める「背番号」
上の図には「青木 花」さんが2人います。氏名では、どちらの青木さんかわかりません。そこで、表の中で行を1つに特定できる列 を決めておきます。これが 主キー です。
主キーの条件
- 値が 重複しない(一意性)
- 値が 空(NULL)でない
身近な主キー
- 学校の 生徒番号、会社の 社員番号
- 図書館の 蔵書番号(同じ本が2冊あっても番号は別)
- ネットショップの 注文番号
逆に、氏名・生年月日・住所 は同じ人がいる可能性があるので、主キーには向きません。
複合主キー
1つの列だけでは行を特定できないとき、複数の列を組み合わせて 主キーにできます。これを 複合主キー(連結キー)といいます。
例えば成績表で「生徒番号」だけだと、同じ生徒が国語・数学…と複数行あって重複します。「生徒番号 + 科目」 の組なら1行に決まります。
外部キー:表と表をつなぐ
関係データベースでは、データを複数の表に分けて、共通の列 で結び付けます。他の表の主キーを参照する列を 外部キー といいます。
担任の名前を生徒1人ずつに書くと、担任が替わったときに全員分を直す必要があります。表を分けて外部キーでつなげば、クラス表の1か所を直すだけ で済みます。
外部キーには、参照先の表に実在する値しか入れられない というルールがあります。これを 参照整合性制約 といいます。存在しない「9組」の生徒を登録したり、生徒が所属している「1組」をクラス表から削除したりする操作は、DBMSによって拒否されます(設定によっては関連する行も一緒に削除・更新されます)。
主キーと外部キー、名前は似ているけど役割が違うんですね。
そう。主キーは自分の表の中で行を見分けるもの、外部キーはよその表の主キーを指さすもの。外部キーの値は重複してもいいんだ。1組の生徒はたくさんいるからね。
| 主キー | 外部キー | |
|---|---|---|
| 役割 | 自分の表の行を1つに特定 | 他の表の主キーを参照し、表どうしを関連付ける |
| 重複 | 不可 | 可(同じクラスの生徒が複数いる) |
| 空(NULL) | 不可 | DBMSの設定による |
| 守るルール | 一意性制約・NOT NULL制約 | 参照整合性制約 |
インデックス:検索を速くする索引
データが何百万件もあると、端から順に探すのは時間がかかります。そこで、よく検索に使う列に インデックス(索引)を作っておくと、本の巻末の索引のように目的の行をすぐに見つけられます。ただし、データを更新するたびにインデックスも更新されるため、作りすぎると更新処理が遅くなります。
試験に出るポイント
- DBMS はデータベースを管理するソフト(排他制御、障害回復、アクセス権の管理)
- 関係データベースは 表(テーブル) で管理。行=レコード、列=フィールド
- 主キー:行を一意に特定。重複不可・NULL不可。複数列の組なら 複合主キー
- 外部キー:他の表の主キーを参照。値は重複してよい
- 参照整合性制約:参照先に存在しない値の登録や、参照されている行の削除を防ぐ
- インデックス:検索を速くする索引